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

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

固然不記得了:) 閉包

這篇文章距離上篇時間過久遠了,遙遠的我都快忘記了。仍是把截圖貼上吧ide

wKiom1VyXUySUg-RAAFLOm4XEBo344.jpg

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

這麼簡單?spa

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


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

        

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

        在E:\GO\workspace\pwm\src\util下建立一個common.go源文件,裏面填寫以下內容element

        wKiom1WEubOCL159AADGA5swt3o258.jpg

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

        在E:\GO\workspace\pwm\src下建立一個launcher.go源文件,裏面填寫以下內容

        wKioL1WEvLDA4dYlAACwCf6nSmo771.jpg

        上面的launcher.go經過「import關鍵字」把包(common)所在的路徑(util)導入進來,而後再經過「包名.函數名(common.IsEmpty())」的方式實現調用。


備註:

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

import fmt

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

解釋:之因此能這樣寫的緣由是「包名」和「路徑」使用了相同的名稱。這裏爲了把包表述清楚,故意把「包」和「包所在路徑」使用了不一樣的名稱。



二、函數

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

wKioL1WKqyGgw0L6AAB7K6GYY48275.jpg


(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幫着程序猿實現了 :)


三、函數的不定參數

不定參數並非新興事物,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

}


四、結束語

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

相關文章
相關標籤/搜索