我是学习Go语言的初学者,但我对以下两个问题感到困惑:
第一:
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()
有效,但是how can I assigned to it
?
第二:
据我所知,函数是一等公民,因此我可以将函数作为参数传递给另一个函数/方法,也可以声明一个函数变量,所以how does a function value works
,它实际上是一个函数指针吗?
我阅读了一些有关对齐和填充的文章,我知道一个接口值占用16个字节(64位系统),因为接口值由数据指针和类型指针what about function value
组成?我使用unsafe.Sizeof(funcValue)
并返回8,所以我猜它实际上是一个函数指针。有没有办法证明它(对还是错)?
答案 0 :(得分:0)
如果您希望能够使用指向该函数的变量的地址,则需要先将其分配给变量。
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。
答案 1 :(得分:0)
可以将函数文字分配给变量或直接调用。
函数文字是闭包:它们可以引用在中定义的变量 周围的功能。然后,这些变量将在 周围的函数和函数文字,它们作为 只要它们可以访问。
type S struct{
a func()
b func(i int, j float32, k string)
c *func()
}
但是在将函数分配给变量时。您实际上是在使用func
的地址,该地址不是变量。首先将函数分配给变量,然后可以分配该变量的地址。
func main(){
s := S{c: &func(){}} // Error: Cannot take the address of `func(){}`
}
错误是:
错误:无法获取
func(){}
的地址
您只能获取变量的地址。
package main
import ("fmt")
type S struct{
a func()
b func(i int, j float32, k string)
c *func()
}
func main() {
anonymous := func(){}
temp := S{c: &anonymous}
fmt.Println(temp.c)
}