为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
FFIVE 2022-01-10 14:36:28
我有一个从一些 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)}程序打印我的物品清单
查看完整描述

3 回答

?
沧海一幻觉

TA贡献1824条经验 获得超5个赞

好的,是的,这确实改变了问题。我立即想到的是,您只需要创建一个接口,例如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我可以尝试提供帮助。


查看完整回答
反对 回复 2022-01-10
?
慕慕森

TA贡献1856条经验 获得超17个赞

Nvm,这行不通。忘记了 go 没有继承的事实。


您可以将数组转换为切片,并让函数将切片作为参数。


names := []string{"leto", "paul", "teg"}

process(names[:])


func process(names []string) {

  ...

}


查看完整回答
反对 回复 2022-01-10
?
UYOU

TA贡献1878条经验 获得超4个赞

您可以使用基本数组概念调用这种类型的结构值数组:在此示例中,[]item 应称为 item.Item[i].Unitprice


我希望你会有一些想法



type UserItem struct {

    UniqueID string `json:"uniqueID" bson:"uniqueID,omitempty"`

    Item     []Item

}


//Item : ""

type Item struct {

    ProductName   string  `json:"productName" bson:"productName,omitempty"`

    UnitPrice     float64 `json:"unitPrice" bson:"unitPrice,omitempty"`

    Quantity      float64 `json:"quantity" bson:"quantity,omitempty"`


//main : ""

func main(){

    for i := 0; i < len(item.Item); i++ {

        SubTotal := item.Item[i].UnitPrice * item.Item[i].Quantity

        TotalTax := (item.Item[i].TaxPercentage / 100)

        TotalTax = SubTotal * TotalTax

        Tax := SubTotal + TotalTax

        fmt.Println(Tax)

}


查看完整回答
反对 回复 2022-01-10
  • 3 回答
  • 0 关注
  • 170 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信