- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我找到了两个问题并阅读了它们:
但我仍然不明白为什么我尝试映射一个出错的对象:
./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 isT
.
这里的类型是*MyStruct
,它是您的Action
方法的接收者类型。因此,您可以使用变量 dynamic
调用该方法。
关于go - 如何在变量的动态类型上调用方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36439733/
COW 不是奶牛,是 Copy-On-Write 的缩写,这是一种是复制但也不完全是复制的技术。 一般来说复制就是创建出完全相同的两份,两份是独立的: 但是,有的时候复制这件事没多大必要
我是一名优秀的程序员,十分优秀!