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

在 Go 中使用嵌套的 []struct 循环?

在 Go 中使用嵌套的 []struct 循环?

Go
慕的地8271018 2021-11-08 15:48:31
我有一个正在使用的结构,但我不确定如何正确遍历它。我想访问字段名称,但它所做的只是在每个循环中递增计数。这是我的结构:type ImgurJson struct {      Status int16 `json:"status"`      Success bool `json:"success"`      Data []struct {            Width int16 `json:"width"`            Points int32 `json:"points"`            CommentCount int32 `json:"comment_count"`            TopicId int32 `json:"topic_id"`            AccountId int32 `json:"account_id"`            Ups int32 `json:"ups"`            Downs int32 `json:"downs"`            Bandwidth int64 `json:"bandwidth"`            Datetime int64 `json:"datetime"`            Score int64 `json:"score"`            Account_Url string `json:"account_url"`            Topic string `json:"topic"`            Link string `json:"link"`            Id string `json:"id"`            Description string`json:"description"`            CommentPreview string `json:"comment_preview"`            Vote string `json:"vote"`            Title string `json:"title"`            Section string `json:"section"`            Favorite bool `json:"favorite"`            Is_Album bool `json:"is_album"`            Nsfw bool `json:"nsfw"`             } `json:"data"`}这是我的功能:func parseJson(file string) {      jsonFile, err := ioutil.ReadFile(file)      if err != nil {            ...            }      jsonParser := ImgurJson{}      err = json.Unmarshal(jsonFile, &jsonParser)      for field, value := range jsonParser.Data {            fmt.Print("key: ", field, "\n")            fmt.Print("value: ", value, "\n")      }}如何循环遍历 Go 中的嵌套 []struct 并返回字段?我看过几篇关于反思的帖子,但我不明白这是否对我有帮助。我可以返回每个字段的值,但我不明白如何将字段名称映射到键值。将“keys”重命名为“field”,抱歉!没有意识到它们被称为字段。我希望能够打印:field: Width value: 1234我想了解如何执行此操作,以便稍后可以按名称调用特定字段,以便将其映射到 SQL 列名称。
查看完整描述

3 回答

?
HUX布斯

TA贡献1876条经验 获得超6个赞

这段基于示例的代码应该为您完成;http://blog.golang.org/laws-of-reflection


import "reflect"



for _, value := range jsonParser.Data {

            s := reflect.ValueOf(&value).Elem()

            typeOfT := s.Type()

            for i := 0; i < s.NumField(); i++ {

            f := s.Field(i)

            fmt.Print("key: ", typeOfT.Field(i).Name, "\n")

            fmt.Print("value: ", f.Interface(), "\n")

       }


}

请注意,在您的原始代码中,循环正在迭代名为Data. 这些东西中的每一个都是该匿名结构类型的对象。那时您还没有处理字段,从那里,您可以利用该reflect包打印结构中字段的名称和值。您不能仅range在本机上遍历结构,操作未定义。


查看完整回答
反对 回复 2021-11-08
?
哆啦的时光机

TA贡献1779条经验 获得超6个赞

这是我们在评论中讨论的另一种方法:


请记住,虽然这比反射更快,但直接使用结构字段并将其设为指针 ( Data []*struct{....})仍然更好、更有效。


type ImgurJson struct {

    Status  int16                    `json:"status"`

    Success bool                     `json:"success"`

    Data    []map[string]interface{} `json:"data"`

}

//.....

for i, d := range ij.Data {

    fmt.Println(i, ":")

    for k, v := range d {

        fmt.Printf("\t%s: ", k)

        switch v := v.(type) {

        case float64:

            fmt.Printf("%v (number)\n", v)

        case string:

            fmt.Printf("%v (str)\n", v)

        case bool:

            fmt.Printf("%v (bool)\n", v)

        default:

            fmt.Printf("%v (%T)\n", v, v)

        }

    }

}


查看完整回答
反对 回复 2021-11-08
?
翻过高山走不出你

TA贡献1875条经验 获得超3个赞

您还可以在嵌套结构上使用普通的 golang for 循环进行迭代。


type ImgurJson struct {

      Status int16 `json:"status"`

      Success bool `json:"success"`

      Data []struct {

            Width int16 `json:"width"`

            Points int32 `json:"points"`

            CommentCount int32 `json:"comment_count"`

            TopicId int32 `json:"topic_id"`

            AccountId int32 `json:"account_id"`

            Ups int32 `json:"ups"`

            Downs int32 `json:"downs"`

            Bandwidth int64 `json:"bandwidth"`

            Datetime int64 `json:"datetime"`

            Score int64 `json:"score"`

            Account_Url string `json:"account_url"`

            Topic string `json:"topic"`

            Link string `json:"link"`

            Id string `json:"id"`

            Description string`json:"description"`

            CommentPreview string `json:"comment_preview"`

            Vote string `json:"vote"`

            Title string `json:"title"`

            Section string `json:"section"`

            Favorite bool `json:"favorite"`

            Is_Album bool `json:"is_album"`

            Nsfw bool `json:"nsfw"`

             } `json:"data"`

}


func parseJson(file string) {

      jsonFile, err := ioutil.ReadFile(file)

      if err != nil {

            ...

            }

      jsonParser := ImgurJson{}

      err = json.Unmarshal(jsonFile, &jsonParser)

      for i :=0; i<len(jsonParser.Data); i++ {

            fmt.Print("key: ", jsonParser.Data[i].TopicId, "\n")

      }

}


查看完整回答
反对 回复 2021-11-08
  • 3 回答
  • 0 关注
  • 305 浏览
慕课专栏
更多

添加回答

举报

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