You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 12:54:18