go 中函数式一等公民

  1. 基础语法

    函数可以返回多个值 和python类似,函数返回值可以取名并用在函数体中,返回时只用return即可,仅用于简单函数
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    func func1() {
    fmt.Println("hello")
    }

    func func2(a, b string) {
    fmt.Println(a, b)
    }

    func func3(a, b int) int {
    return a + b
    }

    func func4(a, b int, c string) (res int) {
    res = a + b
    fmt.Println(c)
    return
    }

    func func5(a, b int) (add, mul int) {
    add = a + b
    mul = a - b
    return
    }

    func func6(a, b int) (int, int) {
    var add, mul int
    add = a + b
    mul = a - b
    return add, mul
    }

    //常用于返回是否错误
    func andErr() (int , error){
    return 1, fmt.Errorf("err1")
    }

    //可变参数
    func sum(numbers ...int) int{
    s := 0
    for i := range numbers{
    s+=i
    }
    return s
    }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

2. #### 函数是一等公民

```go
//函数作为参数
func apply(op func(int,int) int ,a,b int) int{
p := reflect.ValueOf(op).Pointer()
opName := runtime.FuncForPC(p).Name()
fmt.Println(opName)
fmt.Printf("call function %s with args (%d,%d)\n",opName,a,b)
return op(a,b)
}
func main() {
apply(func3,1,2)
//main.func3
//call function main.func3 with args (1,2)
//or
apply(func(i int, i2 int) int {
return i+i2
},1,2)
//匿名函数第一个就是func1 第二个就是func2 以此类推
//main.main.func1
//call function main.main.func1 with args (1,2)
}
  1. 闭包

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    func adder() func(v int) int {
    sum := 0
    return func(v int) int {
    sum += v
    return sum
    }
    }

    add := adder()
    for i := 0; i < 9; i++ {
    fmt.Println(add(i))
    }
    /*
    0
    1
    3
    6
    10
    15
    21
    28
    36
    */