为什么在golang中不能取& a函数的地址,但可以取函数值

xtupzzrd  于 2023-03-16  发布在  Go
关注(0)|答案(1)|浏览(159)

假设我在golang中声明了一个func:

func myFunc() {     
    }

声明采用函数地址的函数指针是错误的

fp := &myFunc

“无效操作:无法获取myFunc的地址(func()类型的值)”
但是,我可以将其赋给函数值并获取地址

functionValue := myFunc
fp := &function

“functionValue”和使用函数名“myFunc”有什么不同吗?它们不是同一类型吗?(func())

xqkwcwgp

xqkwcwgp1#

myFunc是一个函数,functionValue是一个函数变量,是一个指向函数的变量,是一个闭包,例如:

var x int
functionValue:=func() int {return x}

在上面,functionValue是一个函数变量,其闭包包含对x的引用。
myFunc这样的命名函数没有关联的闭包。像functionValue这样的函数变量有闭包。当你把它赋给myFunc时,闭包是空的。当你像上面那样赋给它时,闭包是非空的。正因为如此,调用函数的机制不同于调用函数变量。
函数变量的地址就是那个变量的地址。

相关问题