第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

無法在任意 Go 結(jié)構(gòu)中使用反射更新嵌套字符串字段

無法在任意 Go 結(jié)構(gòu)中使用反射更新嵌套字符串字段

Go
皈依舞 2022-11-15 17:09:50
我正在嘗試使用 golang 中的反射為任意結(jié)構(gòu)更新結(jié)構(gòu)及其子字段中的所有字符串字段,如下所示:package mainimport (    "fmt"    "reflect"    "strings")func main() {    type Inner struct {        In1 string        In2 []string    }    type Type struct {        Name  string        Names []string        NewSt Inner    }    a := Type{        Name:  " [ (Amir[ ",        Names: nil,        NewSt: Inner{            In1: " [in1",            In2: []string{"  [in2( "},        },    }    trims(&a)    fmt.Printf("%#v\n", a)}func trim(str string) string {    return strings.TrimSpace(strings.Trim(str, "[](){}, "))}func trims(ps interface{}) {    v := reflect.ValueOf(ps).Elem() // Elem() dereferences pointer    for i := 0; i < v.NumField(); i++ {        fv := v.Field(i)        switch fv.Kind() {        case reflect.String:            fv.SetString(trim(fv.String()))        case reflect.Struct:            in := fv.Interface()            trims(&in)        }    }}但我感到恐慌:反射:在結(jié)構(gòu)值錯誤上調(diào)用 reflect.Value.Elem。我該如何解決它,或者有什么更好的方法可以做到這一點?
查看完整描述

1 回答

?
波斯汪

TA貢獻(xiàn)1811條經(jīng)驗 獲得超4個贊

func trims(ps interface{}) {

    v := reflect.ValueOf(ps)

    if v.Kind() == reflect.Ptr {

        v = v.Elem() // Elem() dereferences pointer

    }

    if v.Kind() != reflect.Struct {

        panic("not struct")

    }

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

        fv := v.Field(i)

        switch fv.Kind() {

        case reflect.String:

            fv.SetString(trim(fv.String()))

        case reflect.Struct:

            // use Addr() to get an addressable

            // value of the field

            in := fv.Addr().Interface()


            // do not use &in, that evaluates

            // to *interface{}, that's almost

            // NEVER what you want

            trims(in)

        case reflect.Slice:

            if fv.Type().Elem().Kind() == reflect.String {

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

                    fv.Index(i).SetString(trim(fv.Index(i).String()))

                }

            }

        }

    }

}

https://go.dev/play/p/JkJTJzTckNA


查看完整回答
反對 回復(fù) 2022-11-15
  • 1 回答
  • 0 關(guān)注
  • 110 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號