gpt4 book ai didi

interface - 将接口(interface)类型的集合传递给函数

转载 作者:IT王子 更新时间:2023-10-29 02:17:24 24 4
gpt4 key购买 nike

我无法找出在 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)

但我想针对不同的界面重复使用同一张 map 。基本上我正在索引很多对象,然后将它们传递给需要实现不同接口(interface)来计算结果的各种函数。我想将 map 作为 foo 的 map 传递给一个函数,并将另一个函数作为 foobar 的 map 传递给另一个函数。

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

前往 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)类型的集合传递给函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22825873/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com