猿问

func() 在自定义结构类型上时的接口转换

我有这个完美运行的代码:


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()

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


有什么帮助吗?


谢谢你。


开心每一天1111
浏览 208回答 2
2回答

ABOUTYOU

Go 中的方法只是一个添加了一些语法糖的函数。接收者实际上是函数的第一个参数,因此(*myType).hello- 来自类型的方法 - 实际上是func(*myType); 它没有要调用的接收器实例,因此如果不显式提供一个作为函数参数,就无法调用它。这在 Method Expressions 的规范中有所介绍。如果您改为从该类型的实例中获取方法,则该参数将已被填充,因此:foo := &myType{} fn := foo.hello这fn是func()因为它已经有一个实例可以用作接收器。这在 Method Values 的规范中有所介绍。

一只甜甜圈

初始化后添加struct实例函数:funcMapstructfunc main() {    mt := &myType{        field1: "qwe",        field2: "asd",        funcMap: map[string]interface{}{},    }    mt.funcMap["hello"] = mt.hello    mt.callDynamically("hello")}
随时随地看视频慕课网APP

相关分类

Go
我要回答