【问题标题】:Interface conversion when func() is on a custom struct typefunc() 在自定义结构类型上时的接口转换
【发布时间】:2020-10-05 07:00:39
【问题描述】:

我的代码可以完美运行:

package main

import (
    "fmt"
)

var funcMap = map[string]interface{}{
    "hello": hello,
}

func main() {
    callDynamically("hello")
}

func callDynamically(name string) {
    funcMap[name].(func())()
}

func hello() {
    fmt.Println("hello")
}

但是如果我尝试像这样在我的结构类型上定义hello(),我的大脑会发疯:

package main

import (
    "fmt"
)

type myType struct {
    field1  string
    field2  string
    funcMap map[string]interface{}
}

func main() {
    mt := &myType{
        field1: "qwe",
        field2: "asd",
        funcMap: map[string]interface{}{
            "hello": (*myType).hello,
        },
    }

    mt.callDynamically("hello")
}

func (mt *myType) callDynamically(name string) {
    mt.funcMap[name].(func())()
}

func (mt *myType) hello() {
    fmt.Println("hello")
}

https://play.golang.org/p/pPvmaL22_Td

我收到了这个错误:

panic: interface conversion: interface {} is func(*main.myType), not func()

当我的函数在自定义结构类型上定义时,我真的不明白如何在callDynamically 中调用func()

有什么帮助吗?

谢谢。

【问题讨论】:

    标签: go interface type-conversion


    【解决方案1】:

    Go 中的方法只是一个添加了一些语法糖的函数。接收者实际上是函数的第一个参数,因此 (*myType).hello - 来自类型的方法 - 实际上是 func(*myType);它没有要调用的接收器实例,因此如果不显式提供一个作为函数参数,就无法调用它。这已覆盖in the spec on Method Expressions

    如果您改为从该类型的 instance 中获取方法,则该参数已被填充,因此:

    foo := &myType{}
    fn := foo.hello
    

    这里fnfunc(),因为它已经有一个实例可以用作接收器。这已覆盖in the spec on Method Values

    【讨论】:

      【解决方案2】:

      struct初始化后将struct实例的函数添加到funcMap

      func main() {
          mt := &myType{
              field1: "qwe",
              field2: "asd",
              funcMap: map[string]interface{}{},
          }
          mt.funcMap["hello"] = mt.hello
      
          mt.callDynamically("hello")
      }
      

      【讨论】:

        猜你喜欢
        • 2020-03-16
        • 2017-01-11
        • 1970-01-01
        • 1970-01-01
        • 2017-03-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多