猿问

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

我有一个从一些 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{})

但它给我一个错误“不能跨越项目(类型接口{})”如果不是迭代我只是把smth喜欢


func doSmth(items interface{}){

    fmt.Println(items)

}

程序打印我的物品清单


FFIVE
浏览 171回答 3
3回答

沧海一幻觉

好的,是的,这确实改变了问题。我立即想到的是,您只需要创建一个接口,例如Itemer并[]Itemer在函数定义中具有doSmth:type Itemer interface {    Foo() bool} func doSmth(items []Itemer) {    ...}不幸的是,这似乎是不可能的。然后我尝试了其他一些排列,包括 using interface{},[]interface{}以及可变参数函数,但我什么也做不了。经过一番研究,结果证明 Go 不会转换切片的类型。即使切片的每个元素都是接口的实例,Itemer或者interface{}它仍然不会这样做。我无法重新找到源代码,但显然这是因为必须创建一个新切片,并且每个元素都必须从旧切片单独类型转换到新切片:https://stackoverflow。 com/a/7975763/2325784。对我来说,这表明这样的功能doSmth是不可能的。我唯一能建议的就是重构代码。如果您愿意发布更多信息Foo,doSmth我可以尝试提供帮助。

慕慕森

Nvm,这行不通。忘记了 go 没有继承的事实。您可以将数组转换为切片,并让函数将切片作为参数。names := []string{"leto", "paul", "teg"}process(names[:])func process(names []string) {  ...}

UYOU

您可以使用基本数组概念调用这种类型的结构值数组:在此示例中,[]item 应称为 item.Item[i].Unitprice我希望你会有一些想法type UserItem struct {&nbsp; &nbsp; UniqueID string `json:"uniqueID" bson:"uniqueID,omitempty"`&nbsp; &nbsp; Item&nbsp; &nbsp; &nbsp;[]Item}//Item : ""type Item struct {&nbsp; &nbsp; ProductName&nbsp; &nbsp;string&nbsp; `json:"productName" bson:"productName,omitempty"`&nbsp; &nbsp; UnitPrice&nbsp; &nbsp; &nbsp;float64 `json:"unitPrice" bson:"unitPrice,omitempty"`&nbsp; &nbsp; Quantity&nbsp; &nbsp; &nbsp; float64 `json:"quantity" bson:"quantity,omitempty"`//main : ""func main(){&nbsp; &nbsp; for i := 0; i < len(item.Item); i++ {&nbsp; &nbsp; &nbsp; &nbsp; SubTotal := item.Item[i].UnitPrice * item.Item[i].Quantity&nbsp; &nbsp; &nbsp; &nbsp; TotalTax := (item.Item[i].TaxPercentage / 100)&nbsp; &nbsp; &nbsp; &nbsp; TotalTax = SubTotal * TotalTax&nbsp; &nbsp; &nbsp; &nbsp; Tax := SubTotal + TotalTax&nbsp; &nbsp; &nbsp; &nbsp; fmt.Println(Tax)}
随时随地看视频慕课网APP

相关分类

Go
我要回答