函数如何工作

时间:2018-08-24 06:26:44

标签: function go syntax memory-alignment

我是学习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,所以我猜它实际上是一个函数指针。有没有办法证明它(对还是错)?

2 个答案:

答案 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)
}

检查Playground