我无法弄清楚在 Go 中使用接口(interface)的正确方法。我的函数需要获取实现某种方法的项目的映射。它看起来像这样:
type foo interface {
bar() string
}
func doSomething(items map[string]foo) {
}
我正在尝试使用实现 foo
接口(interface)的类型来调用此函数。
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)
但我想针对不同的接口(interface)重用这个相同的映射。基本上,我对很多对象进行索引,然后将它们传递给需要实现不同接口(interface)来计算结果的各种函数。我想将映射作为 foo
的映射传递给一个函数,并将另一个函数作为 foobar
的映射传递给另一个函数。
我尝试了各种类型断言和转换,但似乎没有任何效果,所以我不确定我是否只是没有使用正确的语法或完全错误。
去 Playground http://play.golang.org/p/8mMWCDG7vm .
最佳答案
这是一个相当常见的错误。
您正在混合这两种不同的类型:
map[string]foo
map[string]baz
您不能简单地从一种 map 类型转换为另一种 map 类型。 converting []T
slices to []interface{}
slices 也是如此。 ,或converting chan T
to chan interface{}
(相同的问题/答案,但针对 channel )。
map[string]foo
表示 foo 接口(interface)的映射,而不是所有类型 map[string]T(其中 T 实现了 foo 接口(interface))。
您可以通过进行以下更改来解决该问题:
items := map[string]foo{"a": baz{}}
Playground : http://play.golang.org/p/HxIVGSptwk
编辑:
拥有接口(interface)映射允许您将不同的接口(interface)值类型转换为其他类型的接口(interface)。所以 map 可以重复使用。
Playground : http://play.golang.org/p/20YMWmDjYT
但是您应该有一个接口(interface)类型的映射,该接口(interface)类型是要存储在映射中的类型实现的所有不同方法的交集。如果没有交集,则您必须使用interface{}
来确保可以存储任何类型。
关于interface - 将接口(interface)类型的集合传递给函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22825873/