init函數
Golang中:
- 先初始化全局變量
- 執行init函數
- 執行main函數\
var t = test()
// init方法
func init() {
fmt.Println("init method...")
}
func test()int{
fmt.Println("test methond")
return 0
}
func main(){
fmt.Println("main method")
}
// 輸出結果
test methond
init method...
main method
init函數用來完成一些初始化操作
公有、私有
Golang中的變量、函數,如果以大寫字母開頭則是公有的,如果是小寫字母開頭。則是私有的。
匿名函數
如果某個函數只希望調用一次,那可以考慮使用匿名函數。匿名函數也可以多次調用。
示例:
// 將結果直接賦值給變量
result := func(n1,n2 int) int{
return n1 + n2
}(1,9)
fmt.Println(result)
// 將函數賦值給變量
f := func() {
fmt.Println("匿名函數")
}
f()
全局匿名函數:將函數賦值給一個全局變量,此時匿名函數就成爲了全局匿名函數
var Fun = func()string{
return "sss"
}
閉包
閉包:一個函數和其相關引用環境組合的一個整體
func Add() func (int)int{
// n 只會初始化一次
n := 10
return func(i int) int {
n += i
return n
}
}
func main(){
f := Add();
fmt.Println(f(1))
fmt.Println(f(2))
fmt.Println(f(3))
f2 := Add()
fmt.Println(f2(1))
}
結果:
11
13
16
11
- Add函數返回一個匿名函數,這個匿名函數和變量n組成閉包
- 當我們反覆調用f函數,n在f中只會初始化一次。後面調用會引用上次的值
- 通過f2調用函數,f2中的n會初始化
defer
defer:在函數執行完成後,及時釋放資源
func sum(n1,n2 int) int{
// 當執行到defer時,會將defer修飾的語句壓入獨立的defer棧
// 當函數執行完畢後,會按照先入後出的順序出棧、執行
defer fmt.Println("n1 = ",n1) //3
defer fmt.Println("n2 = ",n2) // 2
n1 ++
n2 ++
s := n1 + n2
fmt.Println("s = ",s) // 1
return s
}
func main(){
res := sum(10,20)
fmt.Println(res) // 4
}
控制檯輸出:
s = 32
// defer棧中的n1、n2不受後面代碼的影響
n2 = 20
n1 = 10
32
- 當執行到defer時,會將defer修飾的語句壓入獨立的defer棧
- 當函數執行完畢後,會按照先入後出的順序出棧、執行
- 當defer語句壓入棧時,也會把值拷貝入棧
用來關閉資源。
值傳遞、引用傳遞
Golang中的兩種傳遞方式:
- 值傳遞
基本數據類型、數組、結構體
- 引用傳遞
指針、切片、map、管道、interface