为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
开心每一天1111 2022-06-13 10:38:38
我有这个完美运行的代码:package mainimport (    "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 mainimport (    "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自定义结构类型上定义时,我真的不明白如何调用。有什么帮助吗?谢谢你。
查看完整描述

2 回答

?
ABOUTYOU

TA贡献1812条经验 获得超5个赞

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

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

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

fnfunc()因为它已经有一个实例可以用作接收器。这在 Method Values 的规范中有所介绍。


查看完整回答
反对 回复 2022-06-13
?
一只甜甜圈

TA贡献1836条经验 获得超5个赞

初始化后添加struct实例函数:funcMapstruct


func main() {

    mt := &myType{

        field1: "qwe",

        field2: "asd",

        funcMap: map[string]interface{}{},

    }

    mt.funcMap["hello"] = mt.hello


    mt.callDynamically("hello")

}


查看完整回答
反对 回复 2022-06-13
  • 2 回答
  • 0 关注
  • 207 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号