Golang函數

init函數


Golang中:

  1. 先初始化全局變量
  2. 執行init函數
  3. 執行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
  1. 當執行到defer時,會將defer修飾的語句壓入獨立的defer棧
  2. 當函數執行完畢後,會按照先入後出的順序出棧、執行
  3. 當defer語句壓入棧時,也會把值拷貝入棧

用來關閉資源。

值傳遞、引用傳遞

Golang中的兩種傳遞方式:

  1. 值傳遞

    基本數據類型、數組、結構體

  2. 引用傳遞

    指針、切片、map、管道、interface

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章