谈谈Go语言中函数的本质
创始人
2024-03-04 07:40:21
0

在很多编程语言中,都会有函数一说,今天我们来聊聊Go语言中的函数。

废话不多说,咱们直接上代码~

代码

package mainimport "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 := funr("r")
}func fun(msg string) {fmt.Println("这里被", msg, "调用")
}

结果

这里被 fun 调用
这里被 r 调用

通过反馈回来的结果我们可以得知,函数名 fun 不加括号时,fun 函数就变成了一个变量;如果 fun 加括号变为 fun( ) 时,就变成了函数调用。

Ⅰ、函数在 Go 语言中是复合类型,可以看作是一种特殊的变量

Ⅱ、函数名( ) : 调用函数,返回结果

Ⅲ、函数名 : 指向函数体的内存地址,一种特殊类型的指针变量

我们现在已经了解到函数在 Go 语言中可以被当作是一种特殊的变量,下面我们来分析一下函数与被函数赋值的变量在内存中是如何存储的。

代码

package mainimport "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。

相关内容

热门资讯

一次性信用修复政策落地,消金公... 一次性信用修复政策重磅落地,12月22日,中国人民银行发布一次性信用修复政策:明确对特定时期、特定金...
从“无”到“有”、从“有”到“... 浦东新区法律援助30周年暨《上海市法律援助若干规定》专题研讨会日前在浦东国际法律服务园举行。 本次研...
暴涨500%!19岁巴尔泰萨吉... 在意甲的舞台上,年轻球员的崛起往往令人瞩目,而19岁的巴尔泰萨吉正是近期最耀眼的新星之一。随着德转最...
完善幼儿园收费政策!三部门发文 来源 | 国家发展改革委微信,转自中国政府网微信 近日,国家发展改革委、教育部、财政部联合印发《关于...
老人“睡梦中”离世,警方靠共享... 孙大妈躺在床上 被子整整齐齐地盖在身上 就像睡着了一样 人却已经没有了呼吸 根据取款人的车辆骑行轨迹...
原创 中... 时值岁末,中航工业微信公众号中的说法,再一次引起了大家的注意。 近日,中航工业在“年末盘点”时,提...
“粤车南下”政策升级 今天起获... (央视财经《经济信息联播》)今天(23日)零时起,“粤车南下”驶入香港市区政策正式实施,广州、珠海、...
原创 李... 2025年12月23日零点,李艺彤在30岁生日当天,发文告别丝芭,强调"人生有梦,各自精彩"。丝芭1...
法律是否必然需要解释?新书《法... 本书聚焦法律解释的确定性或客观性问题——这是法治的一个重要预设,也是法哲学的一个核心难题。 为了回答...
山西调整烟花爆竹燃放政策 卫生... 中新网太原12月23日电 (记者 范丽芳)23日,记者从山西省卫生健康委员会获悉,针对山西调整烟花爆...