gpt4 book ai didi

go - 将结构数组传递给 Go 中的函数

转载 作者:数据小太阳 更新时间:2023-10-29 03:27:14 25 4
gpt4 key购买 nike

我有一个从一些 XML 文件中解析出来的对象。它有这样的结构类型

type Report struct {
Items []Item `xml:......`
AnotherItems []AnotherItem `xml:......`
}
type Item struct {
Name string
}
type AnotherItem struct {
Name string
}
func (Item *Item) Foo() bool {
//some code here
}
func (AnotherItem *AnotherItem) Foo() bool {
//another code here
}

对于每个项目我都必须这样做:

func main(){
//some funcs called to get the report object
doSmth(report.Items)
doSmth(report.AnotherItems)
}
func doSmth(items ????){
for _, item : range items {
item.Foo()
}
}

因为我有不同的项目具有相同的功能我只想有一个 doSmth 所以我不能只做 doSmth(items []Item)问题是 - 我应该写什么而不是“????”让这个工作?我让它通过 report.Items 到 doSmth() 的唯一方法是

func doSmth(items interface{})

但它抛出一个错误“无法覆盖项目(类型接口(interface){})”如果不是迭代,我只是把 smth 放在

func doSmth(items interface{}){
fmt.Println(items)
}

程序打印我的元素 list

最佳答案

<罢工>替换 ????[]Item : Go Playground .它与变量 report.Items 的作用相同。在结构 Report 中定义.

好的,是的,这确实改变了问题。我立即想到的是,您只需要创建一个接口(interface),例如 Itemer。并且有 []ItemerdoSmth 的函数定义中:

type Itemer interface {
Foo() bool
}

func doSmth(items []Itemer) {
...
}

不幸的是this does not seem to be possible .然后我尝试了一些其他排列,包括使用 interface{} , []interface{}以及可变参数函数,我什么也做不了。

doing some research 之后事实证明,Go 不会转换 slice 的类型。即使 slice 的每个元素都是接口(interface)的实例,例如 Itemerinterface{}它仍然不会这样做。 我无法重新找到源代码,但显然是 这是因为必须创建一个新 slice ,并且必须将每个元素从旧 slice 单独类型转换为新 slice : https://stackoverflow.com/a/7975763/2325784 .

对我来说,这表明像 doSmth 这样的函数不可能。

我唯一可以建议的是重构代码。如果您愿意发布有关Foo的更多信息和 doSmth我可以尝试提供帮助。

关于go - 将结构数组传递给 Go 中的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37114313/

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