gpt4 book ai didi

go - 如何在变量的动态类型上调用方法?

转载 作者:IT王子 更新时间:2023-10-29 02:27:43 25 4
gpt4 key购买 nike

我找到了两个问题并阅读了它们:

但我仍然不明白为什么我尝试映射一个出错的对象:

./aaa.go:21: m.Action undefined (type interface {} is interface with no methods)

type MyStruct struct {
}

func (a *MyStruct) Action() {
fmt.Println("Hello")
}

func main() {
var Mstruct map[string]interface{}
Mstruct = make(map[string]interface{}, 100)
Mstruct["MyStruct"] = &MyStruct{}
m := Mstruct["MyStruct"]
fmt.Println(reflect.TypeOf(m)) // *main.MyStruct
m.Action()
}

这总是适用于动态语言,所以我错过了一些静态语言。

最佳答案

表达式

m := Mstruct["MyStruct"]

是一个short variable declaration . specification

If a type is present, each variable is given that type. Otherwise, each variable is given the type of the corresponding initialization value in the assignment.

由于该表达式中不存在类型,变量 m 被赋予相应初始化值的类型,Mstruct["MyStruct"]。该类型是 interface{}

根据您当前的导入,interface{} 的方法集是空的。您无法对类型 interface{} 的值调用任何内容。因此编译器拒绝

m.Action()

您似乎想将 m 用作基于其动态类型 *MyStruct 的方法接收器。您可以使用 type assertion 来做到这一点.例如

dynamic := m.(*MyStruct)
dynamic.Action()

规范说明

If the type assertion holds, the value of the expression is the value stored in x and its type is T.

这里的类型是*MyStruct,它是您的Action 方法的接收者类型。因此,您可以使用变量 dynamic 调用该方法。

关于go - 如何在变量的动态类型上调用方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36439733/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com