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,因为变量是局部变量嘛,可以参考这里

命名返回和匿名返回

  1. 命名返回在返回前不会ret变量接收,始终用的是命名的地址,会受到defer的影响
  2. 匿名返回在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