【Go語言】【11】GO語言的包和函數

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

還記得《【2】Sublime配置GO開發環境》的入門例子嗎?

當然不記得了:)聽

這篇文章距離上篇時間太久遠了,遙遠的我都快忘記了。還是把貼上吧

該例子中的func main()表示這是一個名稱叫main的方法,而package main表示這個方法在main包內,這兩部分的內容就是本節要分享的知識。

這麼簡單?

是的,簡單而不簡約,呵呵,接著往下看!


聽 聽 聽 聽 開發一個應用系統,考慮到代碼的可讀性,往往會把代碼拆分到不同的包,再給包起一個好記的名字,這樣一眼就能明白該包的用途,比如math包,這個就是Go語言本身的數學相關包,該包下面有求絕對值的源檔案abs.go,還有求正弦的asin.go等......

聽 聽 聽 聽聽

1、那麼什麼是包?先看個例子:

聽 聽 聽 聽 在E:\GO\workspace\pwm\src\util下建立一個common.go源檔案,裡面填寫如下內容

聽 聽 聽 聽聽

聽 聽 聽 聽 上面的common.go代碼通過“package關鍵字”指定了它所屬的包(common),接下來就是如何使用common.go中的IsEmpty()函數呢?

聽 聽 聽 聽 在E:\GO\workspace\pwm\src下建立一個launcher.go源檔案,裡面填寫如下內容

聽 聽 聽 聽聽

聽 聽 聽 聽 上面的launcher.go通過“import關鍵字”把包(common)所在的路徑(util)匯入進來,然後再通過“包名.函數名(common.IsEmpty())”的方式實現調用。

備忘:

到這裡可能有人疑惑了,怎麼會這樣呢?平時調用時都是類似如下的方式寫的:

import fmt

fmt.Println("import fmt,then use fmt's function to invoke")

解釋:之所以能這樣寫的原因是“包名”和“路徑”使用了相同的名稱。這裡為了把包表述清楚,故意把“包”和“包所在路徑”使用了不同的名稱。


2、函數

函數是由關鍵字func、函數名、參數列表、傳回值、函數體構成,如下:


(1)如果參數列表中類型相同的參數,如上例可以簡寫為:

func Add(a, b int)(ret int, err error){

聽 聽 return a + b, nil

}

(2)當然調用該函數時,調用者不關心傳回值,甚至不會使用返回變數名,所以上例可以再簡寫為:

func Add(a, b int)(int, 聽error){

聽 聽 return a + b, nil

}

(3)初次使用GO的讀者可能對“多傳回值”感興趣,以前使用別的語言時都是費勁心機地想返回多個值,沒有想到GO幫著程式猿實現了 :)


3、函數的不定參數

不定參數並不是新興事物,Java6已有該事物。所謂不定參數即不清楚參數個數具體是多少,以例子來說明:

func Join(a, b string) string {

return a + b

}

該函數實現兩個入參字串的串連,由於入參只有兩個,所以調用者只需要Join("a", "b")即可。


請接著向下想,若需要把多個字串串連起來呢?你可能想到是把入參變為字串數組,如下:

func Join(a []string) string {

joinStr := ""


for _, element := range a {

joinStr += element

}


return joinStr

}

但這樣又帶來一個調用問題,即調用者必須先初始化一個數組或者切片再進行調用,如下:

s := []string{"a", "b", "c", "d", "e"}

fmt.Println(common.Join(s))


若想讓調用者不構造數組或者切片,就像一般字串一樣對待入參,此時就涉及到“不定參數”的概念,如下:

func Join(a ...string) string {

joinStr := ""


for _, element := range a {

joinStr += element

}


return joinStr

}

與上面的寫法僅在於入參採用“...string”,調用者就像對待一般字串,如下:

fmt.Println(common.Join("a", "b", "c", "d", "e"))


這種不定參數看著比較優雅,同時也存在一個問題:若入參不全是同一種類型呢?比如入參中即有字串也有整形,此時必須把不定參數放在最後,否則會報類似can only use ... as final argument in list錯誤

func Join(i int, a ...string) string {

fmt.Println("----------------", i)

joinStr := ""


for _, element := range a {

joinStr += element

}


return joinStr

}


4、結束語

我看過許式偉、雲動力關於GO的書,還有無聞的視頻,都談及到閉包的問題,其實閉包概念很久之前JS就在使用,這裡不想再談閉包的問題,因為在程式的編寫過程中我認為一切都是順其自然的,寫過一定代碼之後自然就會考慮代碼的優雅性,不留意間就使用到了閉包。


本文出自 “青客” 部落格,請務必保留此出處http://qingkechina.blog.51cto.com/5552198/1665234

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.