在很多编程语言中,都会有函数一说,今天我们来聊聊Go语言中的函数。
废话不多说,咱们直接上代码~
代码
package main
import "fmt"
func main() {
fmt.Printf("%T\n", function1)
fmt.Printf("%T\n", function2)
fmt.Printf("%T\n", function3)
}
func function1() {
}
func function2(a, b int) {
}
func function3(a, b int) int {
return a + b
}
结果
func()
func(int, int)
func(int, int) int
通过结果我们可以看出,在Go语言中,函数也是一种数据类型。既然是数据类型,我们很容易联想到是否可以将函数赋值给一个变量,我们接着测试。
代码
import "fmt"
func main() {
fun("fun")
r := fun
r("r")
}
func fun(msg string) {
fmt.Println("这里被", msg, "调用")
}
结果
这里被 fun 调用
这里被 r 调用
通过反馈回来的结果我们可以得知,函数名 fun 不加括号时,fun 函数就变成了一个变量;如果 fun 加括号变为 fun( ) 时,就变成了函数调用。
Ⅰ、函数在 Go 语言中是复合类型,可以看作是一种特殊的变量
Ⅱ、函数名( ) : 调用函数,返回结果
Ⅲ、函数名 : 指向函数体的内存地址,一种特殊类型的指针变量
我们现在已经了解到函数在 Go 语言中可以被当作是一种特殊的变量,下面我们来分析一下函数与被函数赋值的变量在内存中是如何存储的。
代码
package main
import "fmt"
func main() {
v := function // 引用传递的方式
fmt.Printf("function: %p\n", function)
fmt.Printf("v: %p\n", v)
fmt.Printf("&v: %p\n", &v)
}
func function() {
}
结果
function: 0x76fb00
v: 0x76fb00
&v: 0xc0000ca018
通过结果,我们可以看出,变量 v 的数值是函数 function 的地址,我们画图理解。
解释:变量 v 本身的地址是 0xc0000ca018,其存储的 value 值是 0x76fb00,也就是函数 function 所在的地址,所以当 function 赋值给变量 v 后,我们就可以用变量 v 加括号来调用函数 function。