For loop For循环通过切片并使结构链接到切片

For loop For循环通过切片并使结构链接到切片,for-loop,go,append,For Loop,Go,Append,我需要通过切片执行for循环,以显示结构的值。我想做一件事,让家庭成为[0],食物成为[1],饮料成为[2] package main import ( "fmt" ) type item struct { Category[3] int Quantity int Unitcost float64 } categoryslice = []string{"Household","Food","

我需要通过切片执行for循环,以显示结构的值。我想做一件事,让家庭成为[0],食物成为[1],饮料成为[2]

package main

import (
    "fmt"
)

type item struct {
    Category[3] int
    Quantity int
    Unitcost float64
}

categoryslice = []string{"Household","Food","Drink"}


func main() {
    shoppinglists := []shoppinglist{

        {
            Category: categoryslice[0],
            Quantity: 3,
            Unitcost: 1,
        },
        {
            Category: categoryslice[1],
            Quantity: 1,
            Unitcost: 3,
        },
    }

    fmt.Println("Shopping List Contents:")
    for _, x := range shoppinglists {
        fmt.Println("Category: ", x.Category," Quantity: ", x.Quantity, " Unit Cost: ", x.Unitcost)
    }
    
}

不建议这样做,但您可以将
struct
转换为
map
并迭代生成的
map

将此方法添加到结构中:

func (sl *shoppinglist) ToMap() map[string]interface{} {
    return map[string]interface{}{
        "category":  sl.Category,
        "items":     sl.Items,
        "quantity":  sl.Quantity,
        "unit_cost": sl.Unitcost,
    }
} 
然后像这样迭代切片中的每个贴图

for _, e := range arr {
    for k ,v := range e.ToMap() {
        fmt.Printf("%s: %v\n", k, v)
    }
    fmt.Println()
}

希望我能帮上忙:)

请直接在问题中添加代码来更新问题,而不仅仅是发布远程资源的链接。如果愿意,您可以保留代码之外的链接,但请确保代码在问题中,在stackoverflow上。请参阅:现在在链接中对代码的注释:看起来您想在结构的字段上循环,这在Go中不可能仅使用基本构造,您需要使用
reflect
包才能在结构的字段上循环,但我建议不要这样做,因为它可能非常复杂,特别是对某些人来说“编程新手”。相反,你应该直接使用
structValue.FieldName
…访问字段。通常,如果你需要“循环结构字段”,首先不要使用struct。很不幸,你被没有结构类型及其“对象”的JavaScript感染了“是数组,是散列映射。不在Go中:后者是一种具有相当严格类型的语言,在这种语言中,
struct
类型通常包含不同类型的字段,并且不应该仅仅因为要迭代某个对象,即某个对象是(同源值的)集合而被迭代,不是一组异质值……关于你的例子,假设Go结构中的felds真的可以通过(基于0的)索引访问,那么将“Categry”和“Items”字段(两者都是
string
类型)的值附加到名为“totals”的变量的语义是什么-哪种类型的提示表明它包含一些数量值的完整总和?我的意思是,你确定你已经考虑过你的方法了吗?@mkopriva你可以通过在评论中简单地写[ask]链接到:)类似于写[mcve]和使用[edit]按钮。你可以使用json编码器将结构映射到
映射[string]接口{}
。还有一些github包可以实现这一点(例如:)