go语言中的函数是一个引用类型的变量, 变量名就是函数名
func main() {
println(add)
}
func add(a,b int) int {
return a+b
}
输出:0x473550
声明多个相同的函数(函数体不同), 那么这些函数就是相同类型的
可以使用type声明出这种函数类型:
type func_AB func(a ,b int) int // 定义函数类型: func_AB 它表示此类函数
func main() {
sum := operateADD(add, 10, 20) // add是func_AB类型的变量
fmt.Println(sum)
minus := operateMINUS(minus, 10, 20) // sub也是func_AB类型的变量
fmt.Println(minus )
}
func add(a, b int) int {
return a+b
}
func minus(a, b int) int {
return a-b
}
//第一个参数需要: func_add类型的
func operateADD(op func_AB, a, b int) int {
return add(a,b)
}
func operateMINUS(op func_AB, a, b int) int {
return minus(a,b)
}
如上add和minus都是函数, 也是func_AB类型的变量
同一个包中的函数名不能相同(即不可重载)
函数是不能进行比较的:
func main() {
c := add
if c==add { // error, 会报错:提示函数只能与nil比较
fmt.Println("equals")
}
}
func add(a, b int) int {
return a+b
}
函数参数传递
函数参数的传递有值传递和引用传递
无论是哪种传递, 都是将 参数复制一份 传递给函数
即: 值传递复制值, 引用传递复制地址
通常引用传递比值传递高效, 因为地址最多是64位, 即8个字节
值传递则要根据值的大小来确定(如果是结构体, 则可能很大)
注: map, slice, chan, 指针, interface是引用类型, 即: 默认传递的就是地址