【问题标题】:How does a function works函数是如何工作的
【发布时间】:2018-08-24 06:26:44
【问题描述】:

我是一个学习围棋的初学者,对以下两个问题感到困惑:

第一

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

【问题讨论】:

    标签: function go syntax memory-alignment


    【解决方案1】:

    如果您希望能够使用指向该函数的变量的地址,您需要先将其分配给一个变量。

    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

    【讨论】:

      【解决方案2】:

      函数字面量可以分配给变量或直接调用。

      函数字面量是闭包:它们可以引用定义在 一个周边功能。然后这些变量在 周围的函数和函数字面量,它们作为 只要它们可以访问。

      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

      【讨论】:

        猜你喜欢
        • 2021-03-30
        • 2020-07-18
        • 2015-11-08
        • 2017-05-21
        • 2011-04-24
        • 2017-12-08
        • 2020-09-19
        • 2018-06-15
        • 2012-03-22
        相关资源
        最近更新 更多