在Go中创建map [string] interface {}的方法

ans*_*onl 2 json assert interface go unmarshalling

我已经定义了一个类型

type UnknownMapString map[string]interface{}
Run Code Online (Sandbox Code Playgroud)

我也有这样的方法

func (m UnknownMapString) Foo() {
    fmt.Println("test!")
}
Run Code Online (Sandbox Code Playgroud)

跑步时我感到恐慌:

接口转换:接口是map [string] interface {},而不是main.UnknownMapString

map [string] interface {}从JSON输入中解组.

游乐场复制它 - > http://play.golang.org/p/kvw4dcZVNH

我认为你不能将接口作为方法的接收者,所以我们需要键入assert(not convert?)到Named Type,并使用Named Type作为方法的接收者.请让我知道我做错了什么.谢谢!

Von*_*onC 5

val = val.(UnknownMapString)
Run Code Online (Sandbox Code Playgroud)

这是一个类型断言,它假定命名类型 UnknownMapString与未命名类型相同map[string]interface{}.
类型的身份告诉我们:

命名和未命名类型总是不同的.

但是:你可以指定map[string]interface{}UnknownMapString,因为

x在以下情况下,可分配给类型的变量T(" x可分配给T"):

x的类型VT具有相同的底层类型,并且至少有一个VT不是命名类型.

这可行:

var val2 UnknownMapString  = val.(map[string]interface{})
val2.Foo()
Run Code Online (Sandbox Code Playgroud)

val2不是未命名的类型,val2并且val.(map[string]interface{})底层类型和底层类型都是相同的.

play.golang.org

输出:

test!
Run Code Online (Sandbox Code Playgroud)