Csv 遍历golang中的嵌套结构,并将值存储在切片字符串的切片中

Csv 遍历golang中的嵌套结构,并将值存储在切片字符串的切片中,csv,go,struct,slice,Csv,Go,Struct,Slice,我有一个嵌套结构,我需要遍历字段并将其存储在slice的字符串切片中。然后,将其输出到csv文件。 现在的问题是,我手动访问结构中的每个字段,并将其存储在切片接口的切片中,但我的实际代码有100个字段,因此手动调用每个字段没有意义。 另外,在将切片接口的切片存储到csv时遇到问题,因为在写入输出为[][]接口{}的csv文件时出现以下错误 // for _, value := range output { // err := writer.Write(value) /

我有一个嵌套结构,我需要遍历字段并将其存储在slice的字符串切片中。然后,将其输出到csv文件。 现在的问题是,我手动访问结构中的每个字段,并将其存储在切片接口的切片中,但我的实际代码有100个字段,因此手动调用每个字段没有意义。 另外,在将切片接口的切片存储到csv时遇到问题,因为在写入输出为[][]接口{}的csv文件时出现以下错误

//      for _, value := range output {
//          err := writer.Write(value) //ERROR: can't use value (type []interface{}) as type []string in argument to writer.Write (build)
//          checkError("Failed write to file", err)
//      }: 
`can't use value (type []interface{}) as type []string in argument to writer.Write (build)`
代码:

type ApiStruct struct {
    Response []struct { //100 more fields
        A int         `json:"a"`
        B interface{} `json:"b"`
        C bool        `json:"c"`
        D string      `json:"d"`
        E int         `json:"e"`
        F float64     `json:"f"`
        G []string    `json:"g"`
        H bool        `json:"h"`
        I interface{} `json:"i"`
    } `json:"response"`
}

func main() {
    output := api_call()
    for _, value := range output {
        fmt.Println(value)
    }

    // write_file(output)

}

func api_call() (api_data [][]interface{}) {

    api_response := `{
    "response": [{
            "a": 2,
            "b": null,
            "c": false,
            "d": "sdasdas",
            "e": 22,
            "f": -123.2131231,
            "g": ["string1", "string2"],
            "h": true,
            "i": null
        },
        {
            "a": 4,
            "b": null,
            "c": true,
            "d": "sd",
            "e": 22,
            "f": 1223.2131231,
            "g": ["string3", "string4"],
            "h": true,
            "i": null
        }
    ]
  }`

    var d ApiStruct
    err := json.Unmarshal([]byte(api_response), &d)

    if err != nil {
        log.Fatal(err)
    }

    //instead of manually creating the headers or row lables for CSV output, want to know if there's a way to iterate through the key values in the struct
    api_data = append(api_data, []interface{}{"A", "B", "C", "D", "E", "F", "G", "H", "I"})

    for _, v := range d.Response {
        api_data = append(api_data, []interface{}{v.A, v.B, v.C, v.D, v.E, v.F, v.G, v.H, v.I})

        /*
            I want to do a for loop on those fields and store values in an array like this or any other way that's easier to store in a csv file.
            Instead of accessing each field individually (v.A, v.B), I want to iterate through the fields because
            I have 100 fields in the struct so doesn't make sense to do v.A, etc 100 times.
            Also, I am not sure if I can range over the interface slice of slice and store it in a csv file. Think it needs to be a string slice of slice [][]string.
            Maybe need to convert interface slice of slice: [][]interface{} to string slice of slice: [][]string

        */

    }

    return
}
有关代码中的更多详细信息/注释,请参见下面的链接:


如果有任何不清楚的地方,请告诉我!感谢您的帮助

您可以通过使用以编程方式处理结构的字段,尤其是和类型。例如:

type Foo struct {
  A int
  B bool
  C string
  D float64
  E interface{}
}

func main() {
  f := Foo{1, true, "foo", 3.45, nil}
  t := reflect.TypeOf(f)
  v := reflect.ValueOf(f)

  for i := 0; i < v.NumField(); i++ {
    fmt.Printf("OK: %q -> %#v\n", t.Field(i).Name, v.Field(i))
  }
  // OK: "A" -> 1
  // OK: "B" -> true
  // OK: "C" -> "foo"
  // OK: "D" -> 3.45
  // OK: "E" -> interface {}(nil)
}

可以通过使用以编程方式处理结构的字段,特别是和类型。例如:

type Foo struct {
  A int
  B bool
  C string
  D float64
  E interface{}
}

func main() {
  f := Foo{1, true, "foo", 3.45, nil}
  t := reflect.TypeOf(f)
  v := reflect.ValueOf(f)

  for i := 0; i < v.NumField(); i++ {
    fmt.Printf("OK: %q -> %#v\n", t.Field(i).Name, v.Field(i))
  }
  // OK: "A" -> 1
  // OK: "B" -> true
  // OK: "C" -> "foo"
  // OK: "D" -> 3.45
  // OK: "E" -> interface {}(nil)
}

实际问题中没有代码,游乐场链接太多了。请附上一份。您的问题在一个或两个字段中肯定同样有效。补充,对此表示抱歉。如果丢失了什么,请告诉我。您的数据源是API响应这一事实是否与您的实际问题有关?似乎您只是想知道如何将“Response”结构转换为CSV,而不必显式地引用它的每个字段(A、B、C等)。我不认为我的数据源是个问题。我上面提供的示例响应与我的API响应类似,只是它是一个大的JSON blob。我试图遍历该结构中的字段并输出到csv文件,但不确定是否有直接的方法。要遍历任意结构的字段,您应该使用包
reflect
。实际问题中没有代码,游乐场链接太多。请附上一份。您的问题在一个或两个字段中肯定同样有效。补充,对此表示抱歉。如果丢失了什么,请告诉我。您的数据源是API响应这一事实是否与您的实际问题有关?似乎您只是想知道如何将“Response”结构转换为CSV,而不必显式地引用它的每个字段(A、B、C等)。我不认为我的数据源是个问题。我上面提供的示例响应与我的API响应类似,只是它是一个大的JSON blob。我正在尝试迭代该结构中的字段并输出到csv文件,但不确定是否有直接的方法。要迭代任意结构的字段,您应该使用包
reflect
。太好了,谢谢。是否可以显示另一个具有嵌套结构的示例,如我的示例所示?我尝试使用“reflect”,但它在嵌套结构中不太起作用。对不起,这是我的错trouble@shishh03我在您的示例代码中没有看到任何嵌套结构,只是
apitstruct.Response
…我对golang非常陌生,所以我假设API struct中的Response struct称为嵌套结构,我的错:)在您的示例中,您只看到了Foo struct,其中包含不同的字段,而在我的示例中,我有apirstruct,然后是带有不同字段的Response Struct。我不确定如何遍历响应结构中的字段。我将以您提供的示例进行实验。给我几个小时!太好了,谢谢你。是否可以显示另一个具有嵌套结构的示例,如我的示例所示?我尝试使用“reflect”,但它在嵌套结构中不太起作用。对不起,这是我的错trouble@shishh03我在您的示例代码中没有看到任何嵌套结构,只是
apitstruct.Response
…我对golang非常陌生,所以我假设API struct中的Response struct称为嵌套结构,我的错:)在您的示例中,您只看到了Foo struct,其中包含不同的字段,而在我的示例中,我有apirstruct,然后是带有不同字段的Response Struct。我不确定如何遍历响应结构中的字段。我将以您提供的示例进行实验。给我几个小时!