一、普通函数

package main

import "fmt"

func eval(a, b int, op string) int {
    switch op {
    case "+":
        return a + b
    case "-":
        return a - b
    case "*":
        return a * b
    case "/":
        return a / b
    default:
        panic("unsupported operation:" + op)
    }
}

func main() {
    fmt.Println(eval(10, 40, "+"))
}

二、返回多个值

package main

import "fmt"

func div(a, b int) (int, int) {
    return a / b, a % b
}

func main() {
    q, r := div(13, 3)
    fmt.Println(q, r)
}

还可以定义返回值变量,这样 return 就会直接返回,
但是如果写的代码很多行,可能搞不清楚到底是哪一行给 qr赋值,所以还是建议在 return 的时候指明具体返回值

package main

import "fmt"

func div(a, b int) (q int, r int) {
    q = a / b
    r = a % b
    return
}

func main() {
    q, r := div(13, 3)
    fmt.Println(q, r)
}

如果指想接收一个返回值

    _, r := div(14, 3)

多值返回,通常是增加错误信息一起返回

package main

import "fmt"

func eval(a, b int, op string) (int, error) {
    switch op {
    case "+":
        return a + b, nil
    case "-":
        return a - b, nil
    case "*":
        return a * b, nil
    case "/":
        return a / b, nil
    default:
        return 0, fmt.Errorf("unsuported operation:%s", op)
    }
}

func main() {
    if result, err := eval(20, 10, "+"); err != nil {
        fmt.Println("Error:", err)
    } else {
        fmt.Println("Result:", result)
    }

}

三、函数式编程

go 语言是函数式编程语言,所以函数是一等公民
函数的参数、返回值、函数体内都可以有函数

package main

import (
    "fmt"
    "math"
)

func div(a, b int) (q int, r int) {
    return a / b, a % b

}

func apply(op func(int, int) int, a, b int) int {
    return op(a, b)
}
func pow(a, b int) int {
    return int(math.Pow(float64(a), float64(b)))
}
func main() {
    fmt.Println(apply(pow, 2, 3))
}

也可以定义匿名函数直接当作参数

fmt.Println(
        apply(
            func(a, b int) int {
                return int(math.Pow(float64(a), float64(b)))
            },
            3,
            4,
        ),
    )

四、可变参数

package main

import (
    "fmt"
    "math"
)

func sum(numbers ...int) int {
    s := 0
    for i := range numbers {
        s += numbers[i]
    }
    return s
}

func main() {
    fmt.Println(sum(1, 2, 3))
}

numbers 相当于就是一个数组