Go语言的函数支持 递归、多返回值、可变参数等功能。
在Go语言中,函数类型和其他类型一样,作为一等公民,可以当成其他函数的参数等操作。
函数类型是引用类型。
函数的形参是局部变量,只在本函数内有效。
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类型都可以,标记调用的成功与否。
deferpackage 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 revoverpackage 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