将一组接口类型传递给函数

时间:2014-04-03 00:56:26

标签: interface go

我无法找出在Go中使用接口的正确方法。我的函数需要获取实现某种方法的项的映射。它看起来像这样:

type foo interface {
    bar() string
}

func doSomething(items map[string]foo) {

}

我正在尝试使用实现foo接口的类型调用此函数。

type baz struct { }

func (b baz) bar() string {
    return "hello"
}

items := map[string]baz{"a": baz{}}
doSomething(items)

但是我收到以下错误:

cannot use items (type map[string]baz) as type map[string]foo in function argument

但是,当我这样做时,它工作正常:

items := map[string]foo{"a": baz{}}
doSomething(items)

但是我想针对不同的接口重用这个相同的映射。基本上我正在索引很多对象,然后将它们传递给需要实现不同接口来计算结果的各种函数。我想将地图作为foo的地图传递给一个函数,将另一个函数作为foobar的地图传递。

我尝试了各种类型的断言和转换,但似乎没有任何工作,所以我不确定我是不是使用了正确的语法,或者只是完全错误。

http://play.golang.org/p/8mMWCDG7vm去游乐场。

1 个答案:

答案 0 :(得分:1)

这是一个相当常见的错误。

您正在混合这两种不同的类型:

map[string]foo

map[string]baz

您不能简单地从一种地图类型转换为另一种地图类型。 converting []T slices to []interface{} slicesconverting chan T to chan interface{}也是如此(相同的问题/答案,但对于频道而言)。

map[string]foo表示foo接口的映射,而不是所有类型map [string] T其中T实现foo接口。

您可以通过进行此更改来解决此问题:

items := map[string]foo{"a": baz{}}

游乐场: http://play.golang.org/p/HxIVGSptwk

修改

拥有接口映射允许您将不同的接口值类型转换为其他类型的接口。所以地图可以重复使用。

游乐场: http://play.golang.org/p/20YMWmDjYT

但是你应该有一个接口类型的映射,它是要存储在映射中的类型实现的所有不同方法的交集。如果没有交集,则必须使用interface{}来确保可以存储任何类型。