目錄
函數返回多個值
init函數和import
init函數
main函數
函數的參數
值傳遞
引用傳遞(指針)
函數返回多個值
用法如下:
package mainimport ("fmt""strconv"
)// 返回多個返回值,無參數名
func MultFunc1(a int, b int) (int, string) {a = a + 1b = b + 1//數字轉字符串itoa := strconv.Itoa(b)return a, itoa}// 返回多個返回值,有參數名
func MultFunc2(a int, b int) (r1 int, r2 int) {//形參有默認值 是0fmt.Println("形參r1: ", r1, "r2: ", r2)r1 = a + 1r2 = b + 1return}func MultFunc3(a int, b int) (int, int) {a = a + 1b = b + 1return a, b}func main() {var a, b = MultFunc1(1, 2)fmt.Println("a=", a, "b=", b)var c, d = MultFunc2(3, 4)fmt.Println("c=", c, "d=", d)var e, f = MultFunc3(5, 6)fmt.Println("e=", e, "f=", f)
}
形參是有默認值的 0 ""(空串) false?
init函數和import
init函數
init函數可以在package main 中,可在其他package中,可在同一個package中出現多次
main函數
main 函數只能在package main中。
執行順序
golang中有兩個保留的函數:init函數(能夠應用于所有的package)和main函數(只能用于package main)。這兩個函數在定義的時候不能有任何的返回值和參數
雖然package里面可以寫任意多個init函數,但這無論是對于可讀性還是以后的可維護性來說都是不方便的,所以建議用戶在一個package中每個文件只寫一個init函數。
程序的初始化和執行都始于main包
如果main包還導入了其它的包,那么就會在編譯時將它們依次導入。有時一個包會被多個包同時導入,那么它只會被導入一次(例如很多包可能都會用到fmt包,但它只會被導入一次,因為沒有必要導入多次)。
當一個包被導入時,如果該包還導入了其它的包,那么會先將其它包導入進來,然后再對這些包中的包級常量和變量進行初始化,接著執行init函數(如果有的話),依次類推。
等所有被導入的包都加載完畢了,就會開始對main包中的包級常量和變量進行初始化,然后執行main包中的init函數(如果存在的話),最后執行main函數。下圖詳細地解釋了整個執行過程:
測試例子
代碼結構如下
Lib1.go
package lib1import "fmt"func init() {fmt.Print("我是lib1")
}func Lib1Test() {fmt.Println("lib1Test")
}
Lib2.go
package lib2import ("fmt"
)func init() {fmt.Print("我是Lib2")
}
func Lib2Test() {fmt.Println("lib2Test")
}
main.go
注意:如果文中沒有使用,就需要家一個_
package mainimport ("fmt""goProject/aaa/lib1""goProject/aaa/lib2"
)func init() {fmt.Print("我是Lib3.go")
}func main() {lib1.Lib1Test()lib2.Lib2Test()}
注意看打印的結果
輸出的順序與我們上面圖給出的順序是一致的
函數的參數
函數如果使用參數,該變量可稱為函數的形參
形參就像是定義在函數體內的局部變量
調用函數,可以通過兩種方式傳遞參數:
值傳遞
值傳遞是指在調用函數的時候將實際的參數復制一份傳遞到函數中,這樣在函數中如果對參數進行修改,則不會影響到實際的參數。
默認情況下,Go 語言使用的是值傳遞,即在調用過程中不會影響到實際參數。
下面使用一個經典的案例:兩數交換
package mainimport "fmt"// 值傳遞
func Swap1(a int, b int) {var temp = aa = bb = temp}// 引用傳遞
func Swap2(a *int, b *int) {var temp = *a*a = *b*b = temp}func main() {a := 1b := 2Swap1(a, b)fmt.Println("值傳遞 a=", a, "b=", b)Swap2(&a, &b)fmt.Println("引用傳遞 a=", a, "b=", b)
}
執行結果如下:
第一種值傳遞的方式交換失敗,是因為副本拷貝
第一種是引用傳遞,他是傳遞地址,那么引出了指針
引用傳遞(指針)
指針在C++中有用到。引用傳遞是指在調用函數時將實際參數的地址傳遞到函數中,那么在函數中對參數所進行的修改,將影響到實際參數。
詳情,可以去看看C++,我也去看看!