本人初学围棋,有以下两个问题很困惑:
第一:
type S struct{
a func()
b func(i int, j float32, k string)
c *func()
}
func main(){
s := S{c: &func(){}} // Error: Cannot take the address of `func(){}`
}
在这个结构中,c *func()
是有效的,但是我如何分配给它
?
第二:
据我所知,函数是一等公民,所以我可以将函数作为参数传递给另一个函数/方法,我也可以声明一个函数变量,所以,函数值是如何工作的
,它是实际上是一个函数指针?
我看了一些关于对齐和填充的文章,我知道一个接口(interface)值占用 16 个字节(64 位系统),因为接口(interface)值由数据指针和类型指针组成,函数值呢
?我使用 unsafe.Sizeof(funcValue)
并返回 8,所以我猜它实际上是一个函数指针。有没有办法证明它(对或错)?
最佳答案
如果您希望能够使用指向此函数的变量地址,您需要先将其分配给一个变量。
package main
type S struct {
a func()
b func(i int, j float32, k string)
c *func()
}
func main() {
c := func() {}
s := S{c: &c} // No error
}
有关函数内部工作的更多信息,请参阅 language spec .
关于function - 一个函数是如何工作的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51998664/