Go语言中函数作为参数传递:传值还是传指针?
Go中函数作为参数传递:传值还是传指针?
在Go语言里,所有参数传递都是传值,函数类型也遵循这个规则。下面结合你的示例具体说明:
第一个示例的细节
看这段代码:
func funcB() { fmt.Println("Hi") } funcA(funcB)
funcA接收的是funcB的函数值副本——但这个副本底层是一个指向funcB代码段的引用(可以理解为包含函数指针的结构体)。因为函数本身是不可变的,所以这个副本和原funcB的函数值在行为上完全一致,你可以把它看作是“指向同一个函数逻辑的引用副本”,而非完整复制整个函数的代码。
第二个示例的细节
再看这段重复传递的代码:
func funcA() { fmt.Println("Hi") } funcB(funcA) funcC(funcA) funcD(funcA) funcE(funcA) funcF(funcA)
每次调用传递的都是funcA的函数值副本,但所有这些副本都指向同一个底层函数代码块。程序启动时,funcA的代码就已经被加载到内存固定位置,不会因为传递而创建新的函数对象。所有接收方拿到的函数值,本质上都是指向这段固定代码的引用副本,不存在多个funcA对象的情况。
总结
- 语法层面是传值(传递函数值的副本)
- 底层实现上,函数值包含指向函数代码的指针,所以所有副本都共享同一段函数逻辑
- 不会因为多次传递而创建新的函数实例
内容的提问来源于stack exchange,提问作者snath03
相关产品推荐
相关产品推荐

