package mainimport "fmt"func sum(nums ...int) int { result := 0 // nums 是[]int类型 for _, v := range nums { result += v } return result}func main() { fmt.Println(sum(1, 2, 3, 4))}
输出
10
可变参数必须排在最后
例如,这样写是错误的
func sum(nums ...int, a int) int { result := 0 // nums 是[]int类型 for _, v := range nums { result += v } return result}
// 创建一个匿名函数并把它赋值给sum变量。var sum = func(a, b int) int { return a + b}
等价于
func sum(a, b int) int { return a + b}
sum是一个变量,它的类型是func(a int, b int) int。func(a int, b int) int又叫函数签名。只要是接收两个int类型,返回一个int类型的函数都可以赋值给sum变量:
main.go
package mainimport "fmt"func sum2(a, b int) int { // 创建函数sum2 return a + b + 2}func main() { sum := func(a, b int) int { return a + b } fmt.Println(sum(1, 1)) sum = sum2 // 赋值,sum, sum2类型相同 fmt.Println(sum(1, 1))}
输出
24
匿名函数
没有名字的函数就叫匿名函数,例如定义函数时直接运行:
main.go
package mainimport "fmt"func main() { func(a, b int) { fmt.Println(a + b) }(1, 2) // 匿名函数,直接运行}
输出
3
函数是引用类型,它的零值是nil:
main.go
package mainimport "fmt"// 给类型起一个别名type myFunc func(int, int) intfunc main() { var sum myFunc // 函数类型的零值是nil fmt.Println(sum == nil)}