多返回值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/