函数
- Go函数不支持 嵌套、重载、默认参数
- 支持特性:无需声明原型、不定长度参数、多返回值、命名返回值参数、匿名函数、闭包
- 函数也可以作为一种类型使用
func main() {
a := 1
A(&a)
//2
fmt.Println(a)
}
func A(b *int) {//这里接收的参数是指针,所以修改变量会影响到原对象
*b = 2
//2
fmt.Println(*b)
}
func main() {
a := 1
A(a)
//1
fmt.Println(a)
}
func A(b int) {//这里接收的是copy后的值,所以修改变量并不影响原对象
b = 2
//2
fmt.Println(b)
}
func main() {
a := func() {
fmt.Println("匿名函数")
}
a()
}
func main() {
f := closure(10)
//15
fmt.Println(f(5))
//17
fmt.Println(f(7))
}
func closure(x int) func(int) int {//闭包
return func(y int) int {
return x + y
}
}
defer
- 函数体执行结束后,按照调用顺序的反向,逐个执行
- 即时函数发生严重错误也会执行
- 支持匿名函数的调用
- 常用于自愿清理、文件关闭、解锁以及记录时间等操作
- 通过与匿名函数配合可在return之后修改函数计算结果
- 如果函数体内某个变量作为defer时匿名函数的参数,则在定义defer时即已经获得了拷贝,否则则是引用某个变量的地址
- go没有异常机制,但有panic/recover模式处理错误
- panic可以在任何地方引发,但recover只有在defer调用的函数中有效
func main() {
fmt.Println("111")
defer fmt.Println("222")
defer fmt.Println("333")
}
输出:
111
333
222
func main() {
defer func() { //必须要先声明defer,否则不能捕获到panic异常
fmt.Println("c")
if err := recover(); err != nil {
fmt.Println(err) //这里的err其实就是panic传入的内容
}
fmt.Println("d")
}()
f()
}
func f() {
fmt.Println("a")
panic(111111111)
fmt.Println("b")
}
输出:
a
c
111111111
d
直通车
一.Go开发工具及命令
二.Go编程基础知识
三.Go的类型与变量
四.Go常量与运算符
五.Go控制语句
六.Go数组
七.Go切片slice
八.Go哈希字典map
九.Go函数func
十.Go结构struct
网友评论