這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
還記得《【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