golang的部分语言特性
闭包
闭包可以理解为一个对象,有方法有属性
import "fmt"
func Increase() func() int {
n := 0
return func() int {
n++
return n
}
}
func main() {
i1 := Increase()
i2 := Increase()
fmt.Println(i1())
fmt.Println(i2())
}
返回的都是1,因为变量是局部变量嘛,可以参考这里
命名返回和匿名返回
- 命名返回在返回前不会ret变量接收,始终用的是命名的地址,会受到defer的影响
- 匿名返回在return前会用ret接收,defer不会影响返回值
package main
import "fmt"
func func1() (i int) {
i = 1
defer func() {
i++
}()
i++
return
}
func func2() int {
i := 1
defer func() {
i++
}()
i++
return i
}
func func3() int {
i := 1
defer func(i int) {
i++
}(i)
i++
return i
}
func func4() (i int) {
i = 1
defer func(i int) {
i++
}(i)
i++
return
}
func func9() (i int) {
i = 1
defer fmt.Println("result =>", func() int { return i * 2 }())
i++
return
}
func main() {
fmt.Println(func1())
fmt.Println(func2())
fmt.Println(func3())
fmt.Println(func4())
fmt.Println(func9())
}
输出是
3
2
2
2
result => 2
2
参考
https://blog.csdn.net/MrQkeil/article/details/104359630
https://segmentfault.com/a/1190000022798222