10-Go语言基础-函数(func)

Scarlett ·
更新时间:2024-09-21
· 963 次阅读

简介

Go语言的函数支持 递归、多返回值、可变参数等功能。
在Go语言中,函数类型和其他类型一样,作为一等公民,可以当成其他函数的参数等操作。
函数类型是引用类型。
函数的形参是局部变量,只在本函数内有效。

使用 函数声明
func 函数名(形参列表)(返回值列表){
函数体
} 函数作为普通类型使用
这里把func1作为参数传给func2来执行。
其中func1的类型是func(int)int package main import ( "fmt" ) func func2 (addfunc func(int)int){ out := addfunc(1) fmt.Println(out) } func main() { var func1 func(int)int func1=func(in int)(out int){ return in+1 } func2(func1) }

看着有点抽象,我们使用type来把函数类型做个重命名。
这里就相当于和struct一样,struct也是做了类型的重命名,否则要跟struct以及后面的一大堆作为类型。

package main import ( "fmt" ) type myfunc func(int)int func func2 (addfunc myfunc){ out := addfunc(1) fmt.Println(out) } func main() { var func1 myfunc func1=func(in int)(out int){ return in+1 } func2(func1) } 多返回值不说了 错误有个建议,最后加一个返回值error类型或者Boolean类型都可以,标记调用的成功与否。 defer
defer后面跟的函数调用。
defer是入栈规则,后进先出。最先声明的defer函数最后执行。
defer的时候for循环小心闭包的问题,你可能会在这里栽跟头。 package main import ( "fmt" ) func main() { defer func(){ fmt.Println("defer1") }() defer func(){ fmt.Println("defer2") }() defer func(){ fmt.Println("defer3") }() defer func(){ fmt.Println("defer4") }() // panic(1) } =》输出 defer4 defer3 defer2 defer1

闭包对for defer的影响

package main import ( "fmt" ) func main() { for i:=0;i输出 3 3 3

正确的代码

package main import ( "fmt" ) func main() { for i:=0;i输出 2 1 0 panic revover
panic会引起函数恐慌(崩溃)。需要传入非nil的参数 package main import ( "fmt" ) func main() { defer func(){ if p:=recover();p!=nil{ fmt.Println(p) } }() //panic(nil)//参数传入nil recover无法捕获到参数,不能定位恐慌原因。 panic(1) } => 1

有意思的问题,recover要在defer的一级函数内,否则无法使用。
正常捕获恐慌,防止代码异常退出。

package main import ( "fmt" ) func myrecover(){ if p:=recover();p!=nil{ fmt.Println(p) } } func main() { defer myrecover() panic(1) } => 1

无法捕获,直接恐慌。

package main import ( "fmt" ) func myrecover(){ if p:=recover();p!=nil{ fmt.Println(p) } } func main() { defer func(){ myrecover() }() panic(1) } => panic: 1 goroutine 1 [running]: main.main() G:/gosrc/mypro1/myrun/main.go:16 +0x66 exit status 2
作者:Virgo没有强迫症



go语言基础 GO func 函数 go语言

需要 登录 后方可回复, 如果你还没有账号请 注册新账号