golang本身的程式進入點就是一個function,名為main的function
package main
func main() {
}
當然可以全部的code都塞在main裡面,只是寫到後來一定會有
1.程式行數太長:寫code不用比行數多啦~~~~簡潔好讀才是重點
2.企業邏輯分不清:拆成獨立邏輯後續查bug或是維護都方便
3.重覆程式碼一直複製貼上
要解決上面的問題,成本最低的作法就是寫成function,
把程式碼拆成一塊一塊的,就跟樂高積木一樣,一塊積木可以當成是一個function,
把n個function組合成一個application。
輸入func按下enter,snippet會自動產生function的code出來。
func () {
}
function的標準寫法
//test是function的名稱,a,b,c是外部傳入的參數,string是回傳值的型別
func test(a string, b int, c bool) string {
fmt.Println("a string:", a, "b int:", b, "c bool:", c)
//return是結束function與回傳回傳值
return "QQ"
}
//也可以指定回傳值的變數名稱
func test(a string, b int, c bool)( res string) {
fmt.Println("a string:", a, "b int:", b, "c bool:", c)
//return是結束function與回傳回傳值
res = "GGQQ"
return res
//因為function已經有宣res1, res2 := test("GG", 9999, false)告回傳變數,可以直接寫return就好,回傳結果跟return res一樣
}
golang的function可以回傳多值,跟c#不一樣rrrrrr,如果func的某個回傳值沒用到,不想宣告變數去接時
可以用底線取代
package main
import "fmt"
func main() {
res1, res2 := test("GG", 9999, false)
//我不需要第一個回傳值
_, res4 := test("GG", 9999, false)
//我不需要第二個回傳值
res5,_ := test("GG", 9999, false)
fmt.Println(res1, res2)
}
func test(a string, b int, c bool) (res1 string, res2 string) {
fmt.Println("a string:", a, "b int:", b, "c bool:", c)
return "QQ", "GG"
}
如果傳入的參數數量不定時也可以這樣子寫。
package main
import "fmt"
func main() {
res := test("GG", "AA", "CC", "DD", "EE")
fmt.Println(res)
res2 := test("GG", "AA")
fmt.Println(res2)
}
func test(multis ...string) string {
for _, param := range multis {
fmt.Println("param:", param)
}
return "GG"
}
golang也有匿名function可以使用,有時候覺得為了某些邏輯或是條件額外寫一個function,會產生使用率很低的function,不寫成function又覺得code落落長不好看,這時候就可以寫匿名function來解決這個困擾~~
寫出乾淨俐落的code是碼農的基本要求rrrr
package main
import "fmt"
func main() {
test := "GOLANG"
var QQ = func() {
fmt.Println(test, "VERY GOOD")
}
HH := func() {
fmt.Println(test, "so GOOD")
}
QQ()
HH()
}
function可以宣告成變數,那可以變成回傳值,簡單來說會return func,可以把A變成B,像是把小夫變成胖虎的概念一樣
package main
import (
"fmt"
)
func main() {
mdfk2020 := testGG("MDFK 2020")
mdfk2020()
}
func testGG(name string) func() {
return func() {
fmt.Println(name)
}
}
煩人的callback function~~簡單說就是把func當參數丟進去function進來去執行
package main
import "fmt"
func main() {
var GG = []string{"MDFK", "2020", "GG"}
test(GG, func(test string) {
fmt.Println("i'm callback:", test)
})
}
func test(s []string, callback func(string)) {
for _, text := range s {
callback(text)
}
}