Go開發(fā)工程師
未來3-5年企業(yè)高性能項目不可替代的語言,從基礎到項目實戰(zhàn)再到重構,真正從入門到精通
在Go語言中,函數(shù)是一等(first-class)類型。這意味著,我們可以把函數(shù)作為值來傳遞和使用。函數(shù)代表著這樣一個過程:它接受若干輸入(參數(shù)),并經(jīng)過一些步驟(語句)的執(zhí)行之后再返回輸出(結果)。特別的是,Go語言中的函數(shù)可以返回多個結果。
函數(shù)類型的字面量由關鍵字func
、由圓括號包裹參數(shù)聲明列表、空格以及可以由圓括號包裹的結果聲明列表組成。其中,參數(shù)聲明列表中的單個參數(shù)聲明之間是由英文逗號分隔的。每個參數(shù)聲明由參數(shù)名稱、空格和參數(shù)類型組成。參數(shù)聲明列表中的參數(shù)名稱是可以被統(tǒng)一省略的。結果聲明列表的編寫方式與此相同。結果聲明列表中的結果名稱也是可以被統(tǒng)一省略的。并且,在只有一個無名稱的結果聲明時還可以省略括號。示例如下:
func(input1 string ,input2 string) string
這一類型字面量表示了一個接受兩個字符串類型的參數(shù)且會返回一個字符串類型的結果的函數(shù)。如果我們在它的左邊加入type
關鍵字和一個標識符作為名稱的話,那就變成了一個函數(shù)類型聲明,就像這樣:
type MyFunc func(input1 string ,input2 string) string
函數(shù)值(或簡稱函數(shù))的寫法與此不完全相同。編寫函數(shù)的時候需要先寫關鍵字func
和函數(shù)名稱,后跟參數(shù)聲明列表和結果聲明列表,最后是由花括號包裹的語句列表。例如:
func myFunc(part1 string, part2 string) (result string) { result = part1 + part2 return }
我們在這里用到了一個小技巧:如果結果聲明是帶名稱的,那么它就相當于一個已被聲明但未被顯式賦值的變量。我們可以為它賦值且在return
語句中省略掉需要返回的結果值。至于什么是return
語句,我就不用多說了吧。顯然,該函數(shù)還有一種更常規(guī)的寫法:
func myFunc(part1 string, part2 string) string { return part1 + part2 }
注意,函數(shù)myFunc
是函數(shù)類型MyFunc
的一個實現(xiàn)。實際上,只要一個函數(shù)的參數(shù)聲明列表和結果聲明列表中的數(shù)據(jù)類型的順序和名稱與某一個函數(shù)類型完全一致,前者就是后者的一個實現(xiàn)。請大家回顧上面的示例并深刻理解這句話。
我們可以聲明一個函數(shù)類型的變量,如:
var splice func(string, string) string // 等價于 var splice MyFunc
然后把函數(shù)myFunc
賦給它:
splice = myFunc
如此一來,我們就可以在這個變量之上實施調(diào)用動作了:
splice("1", "2")
實際上,這是一個調(diào)用表達式。它由代表函數(shù)的標識符(這里是splice
)以及代表調(diào)用動作的、由圓括號包裹的參數(shù)值列表組成。
如果你覺得上面對splice
變量聲明和賦值有些啰嗦,那么可以這樣來簡化它:
var splice = func(part1 string, part2 string) string { return part1 + part2 }
在這個示例中,我們直接使用了一個匿名函數(shù)來初始化splice
變量。顧名思義,匿名函數(shù)就是不帶名稱的函數(shù)值。匿名函數(shù)直接由函數(shù)類型字面量和由花括號包裹的語句列表組成。注意,這里的函數(shù)類型字面量中的參數(shù)名稱是不能被忽略的。
其實,我們還可以進一步簡化——索性省去splice
變量。既然我們可以在代表函數(shù)的變量上實施調(diào)用表達式,那么在匿名函數(shù)上肯定也是可行的。因為它們的本質(zhì)是相同的。后者的示例如下:
var result = func(part1 string, part2 string) string { return part1 + part2 }("1", "2")
可以看到,在這個匿名函數(shù)之后的即是代表調(diào)用動作的參數(shù)值列表。注意,這里的result
變量的類型不是函數(shù)類型,而與后面的匿名函數(shù)的結果類型是相同的。
最后,函數(shù)類型的零值是nil
。這意味著,一個未被顯式賦值的、函數(shù)類型的變量的值必為nil
。
請在命令源碼文件index.go的第37行處為generator
變量賦值,最終使程序打印到標準輸出上的內(nèi)容為Gophers-RD-1 true
。
這條賦值語句可以是:
generator = func(company string, department string, sn uint32) string { return appendSn(company+"-"+department+"-", sn) }
請驗證,完成請求
由于請求次數(shù)過多,請先驗證,完成再次請求
打開微信掃碼自動綁定
綁定后可得到
使用 Ctrl+D 可將課程添加到書簽
舉報