Go學習-function

多返回值function

package main

import (
	"fmt"
)

func main() {
	a, b, c := A()
	fmt.Println(a, b, c)
}

func A() (int, int, int) {
	a, b, c := 1, 2, 3
	return a, b, c
}

不定參

package main

import (
	"fmt"
)

func main() {
	a, b, c := A(1, 2, 3)
	fmt.Println(a, b, c)
}

func A(a ...int) (int, int, int) {
	fmt.Println("參數:", a)
	b, c, d := 4, 5, 6
	return b, c, d
}

函數作爲類型

package main

import (
	"fmt"
)

func main() {
	a := A
	a()
}

func A() {
	fmt.Println("fuction A")
}

閉包

package main


import (
	"fmt"
)


func main() {
	a := A(10)
	fmt.Println(a(1))
	fmt.Println(a(2))
}


func A(x int) func(int) int {
	fmt.Printf("%p\n", &x)
	return func(y int) int {
		fmt.Printf("%p\n", &x)
		return x + y
	}
}

defer

defer的使用,類似於析構函數,函數執行後按照調用順序,後進先出

一般用於資源清理,文件關閉,解鎖,以及記錄時間

通過匿名函數配合可在return後修改函數的計算結構

如果函數體內某個變量作爲defer匿名函數參數,則在定義時候已經獲得數據的拷貝,否者則是這個變量的地址

package main

import (
	"fmt"
)

func main() {
	for i := 0; i < 3; i++ {
		defer fmt.Println(i)
	}
}

package main

import (
	"fmt"
)

func main() {
	for i := 0; i < 3; i++ {
		defer func() {
			fmt.Println(i)
		}()
	}
	fmt.Println("hello world")
}

panic/recover

panic可以在任何地方引發,但recover只要在defer纔可以有效

package main

import (
	"fmt"
)

func main() {
	A()
	B()
	C()
}

func A() {
	fmt.Println("func A")
}

func B() {
	defer func() {
		if err := recover(); err != nil {
			fmt.Println(err)
			fmt.Println("recover in B")
		}
	}()
	panic("panic in B")
}

func C() {
	fmt.Println("func C")
}

defer使用的多個場景

https://chai2010.cn/post/golang/defer-2013/


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