我已经定义了一个Type
type UnknownMapString map[string]interface{}
我也有像他们这样的方法
func (m UnknownMapString) Foo() {
fmt.Println("test!")
}
跑步时我感到恐慌:
界面转换:界面是map [string] interface {},不是 main.UnknownMapString
map [string] interface {}从JSON输入解组。
Playground复制它 - > http://play.golang.org/p/kvw4dcZVNH
我认为你不能将接口作为方法的接收者,因此我们需要将assert(不是转换?)键入命名类型,并使用该命名类型作为方法的接收者。 请让我知道我做错了什么。谢谢!
答案 0 :(得分:5)
val = val.(UnknownMapString)
这是type assertion,假设named type UnknownMapString
与未命名类型map[string]interface{}
相同。
type identity告诉我们:
命名和未命名类型总是不同的。
但是:您can assign map[string]interface{}
到UnknownMapString
因为
x
可分配给T
类型的变量(“x
可分配给T
”):
x
的类型V
和T
具有相同的基础类型,V
或T
中至少有一个不是命名类型。
这样可行:
var val2 UnknownMapString = val.(map[string]interface{})
val2.Foo()
val2
不是未命名的类型,val2
和val.(map[string]interface{})
基础类型都相同。
输出:
test!