亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

帶有接收器的函數,它遍歷 go 中結構的某些字段

帶有接收器的函數,它遍歷 go 中結構的某些字段

Go
神不在的星期二 2022-06-13 17:09:02
我是一個 Golang 新手,試圖構建一個簡單的 CLI。我正在將 API 調用有效負載轉換為一個結構,并希望將此結構中的一些信息格式化為一個很好的可打印字符串。我要打印的信息之一來自結構數組,如本例所示:type Pokemon struct {    Abilities []struct {        Ability struct {            Name string `json:"name"`            URL  string `json:"url"`        } `json:"ability"`        IsHidden bool `json:"is_hidden"`        Slot     int  `json:"slot"`    } `json:"abilities"`    Height int    `json:"height"`    ID     int    `json:"id"`    Name   string `json:"name"`    Types  []struct {        Slot int `json:"slot"`        Type struct {            Name string `json:"name"`            URL  string `json:"url"`        } `json:"type"`    } `json:"types"`    Weight int `json:"weight"`}}我正在嘗試編寫一個通用的受體函數,它遍歷一些結構數組的字段并將其字段連接到一個字符串中。我可以做一個專門迭代某些字段的函數,如下所示:func (p Pokemon) stringifyPokemonAbilities() string {    var listOfAbilities []string    for _, ability := range p.Abilities {        listOfAbilities = append(listOfAbilities, ability.Ability.Name)    }    return strings.Join(listOfAbilities[:], " / ")}返回例如synchronize / inner-focus像這樣工作,我將不得不向該Type領域編寫幾乎相同的功能。我的問題是,如何使這個函數更通用,接受一個字段并對其進行迭代。有什么想法嗎?
查看完整描述

1 回答

?
躍然一笑

TA貢獻1826條經驗 獲得超6個贊

您可以使用relfect來做到這一點。有一個寫得很好的教程,你可以看看。


根據你給的結構,我寫了一個demo。主要思想是通過名稱找到結構體,然后迭代切片,在結構體中找到名稱。


p.stringifyPokemon("Types")您可以使用or p.stringifyPokemon("Abilities")now得到答案。


func (p Pokemon) stringifyPokemon(field string) string {

    value := reflect.ValueOf(p)

    struct1 := value.FieldByName(field)


    if !struct1.IsValid() {

        return ""

    }


    if struct1.Type().Kind() != reflect.Slice {

        return ""

    }


    ans := make([]string, 0)


    for i := 0; i < struct1.Len(); i++ {

        slice1 := struct1.Index(i)

        if slice1.Type().Kind() != reflect.Struct {

            continue

        }


        for j := 0; j < slice1.NumField(); j++ {

            struct2 := slice1.Field(j)

            if struct2.Type().Kind() != reflect.Struct {

                continue


            }

            name := struct2.FieldByName("Name")

            if name.Kind() != reflect.String {

                continue

            }

            ans = append(ans, name.String())

        }

    }


    return strings.Join(ans[:], " / ")

}



查看完整回答
反對 回復 2022-06-13
  • 1 回答
  • 0 關注
  • 116 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號