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

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

如何根據(jù)結(jié)構(gòu)字段類型對值進(jìn)行類型轉(zhuǎn)換?

如何根據(jù)結(jié)構(gòu)字段類型對值進(jìn)行類型轉(zhuǎn)換?

Go
九州編程 2022-06-21 10:44:09
我正在嘗試創(chuàng)建一個(gè)填充給定字段的方法struct,但是要設(shè)置正確的值,我需要轉(zhuǎn)換值以檢查類型是否與結(jié)構(gòu)字段類型匹配。例子:type S struct {    Name string    Age int}該值將始終是string因?yàn)樗鼇碜?URL。const stubQuery = "name=sam&page=30"query, _ := url.ParseQuery(stubQuery)// e.g result: {"name": ["sam"], "age": ["30"]}我已經(jīng)設(shè)法迭代query并從S結(jié)構(gòu)中獲取字段,但是我怎樣才能獲取字段類型并將“30”轉(zhuǎn)換為結(jié)構(gòu)類型?structValue := reflect.ValueOf(&S{}).Elem()structFieldValue := structValue.FieldByName("Age")structFieldType := structFieldValue.Type()val := reflect.ValueOf("30")if structFieldType != val.Type() {} // Always false
查看完整描述

2 回答

?
UYOU

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

應(yīng)用程序必須將字符串解析為可分配給該字段的值。


使用類型開關(guān)和值開關(guān)查找要解析的類型或種類。


使用strconv 包解析數(shù)值和布爾值。使用time 包來解析時(shí)間和持續(xù)時(shí)間。


這是一些示例代碼:


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

t := v.Type()

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

    sf := t.Field(i)


    // Get value from query. Skip if not set.

    values, ok := query[strings.ToLower(sf.Name)]

    if !ok || len(values) == 0 {

        continue

    }


    // Use type switch for specific types.

    switch f := v.Field(i).Addr().Interface().(type) {


    case *time.Time:

        var err error

        *f, err = time.Parse(time.RFC3339, values[0])

        if err != nil {

            log.Fatal(err)

        }

    case *time.Duration:

        var err error

        *f, err = time.ParseDuration(values[0])

        if err != nil {

            log.Fatal(err)

        }


    default:

        // The specific type was not handled. Fallback

        // to using the field kind. This allows us to

        // handle all numeric and bool types without knowing

        // those types explicitly.


        switch sf.Type.Kind() {

        case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:

            n, err := strconv.ParseInt(values[0], 10, sf.Type.Bits())

            if err != nil {

                log.Fatal(err)

            }

            v.Field(i).SetInt(n)

        case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:

            n, err := strconv.ParseUint(values[0], 10, sf.Type.Bits())

            if err != nil {

                log.Fatal(err)

            }

            v.Field(i).SetUint(n)

        case reflect.Float64, reflect.Float32:

            n, err := strconv.ParseFloat(values[0], sf.Type.Bits())

            if err != nil {

                log.Fatal(err)

            }

            v.Field(i).SetFloat(n)

        case reflect.Bool:

            b, err := strconv.ParseBool(values[0])

            if err != nil {

                log.Fatal(err)

            }

            v.Field(i).SetBool(b)

        case reflect.String:

            v.Field(i).SetString(values[0])

        default:

            log.Fatal("unknown type")

        }

    }

}

首先檢查類型,以便將 time.Duration 解析為持續(xù)時(shí)間而不是整數(shù)。


將 log.Fatal 調(diào)用替換為適合您的場景的錯(cuò)誤處理。


查看完整回答
反對 回復(fù) 2022-06-21
?
牧羊人nacy

TA貢獻(xiàn)1862條經(jīng)驗(yàn) 獲得超7個(gè)贊

val := reflect.ValueOf("30")

傳入?yún)?shù)的類型("30"在您的示例代碼中)是string。它的類型永遠(yuǎn)不會(huì)匹配數(shù)字字段的類型。


你必須檢查structFieldType,以確定你應(yīng)該應(yīng)用什么轉(zhuǎn)換val。


另一種方法可能是向您的結(jié)構(gòu)添加一個(gè)特定的方法來填充它的字段:


AssignFields(in url.Values) error

# or

AssignField(name string, value string) error


查看完整回答
反對 回復(fù) 2022-06-21
  • 2 回答
  • 0 關(guān)注
  • 165 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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