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

时间:2014-08-02 04:55:32

标签: json interface go assert unmarshalling

我已经定义了一个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(不是转换?)键入命名类型,并使用该命名类型作为方法的接收者。 请让我知道我做错了什么。谢谢!

1 个答案:

答案 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的类型VT具有相同的基础类型,VT中至少有一个不是命名类型。

这样可行:

var val2 UnknownMapString  = val.(map[string]interface{})
val2.Foo()

val2不是未命名的类型,val2val.(map[string]interface{})基础类型都相同。

play.golang.org

输出:

test!