go語言 從結構體中獲取某個字段的值(反射+泛型)


 

Go 語言提供了 user.Name 語法,來從 user 結構體中獲取 Name 的值。 那么如果我們想將 Name 變成變量該如何做呢?

 

原型:getStructField(input interface{}, key string) (value interface{}, err error)

功能:從 input 結構體中,取出 key 字段 對應的值

 

代碼實現:

package utils

import (
    "errors"
    "fmt"
    "reflect"
)

func GetStructStringField(input interface{}, key string) (value string, err error) {
    v, err := getStructField(input, key)
    if err != nil {
        return
    }
    value, ok := v.(string)
    if !ok {
        return value, errors.New("can't convert key'v to string")
    }
    return
}

func GetStructFloat64Field(input interface{}, key string) (value float64, err error) {
    v, err := getStructField(input, key)
    if err != nil {
        return
    }
    value, ok := v.(float64)
    if !ok {
        return value, errors.New("can't convert key'v to float64")
    }
    return
}

func getStructField(input interface{}, key string) (value interface{}, err error) {
    rv := reflect.ValueOf(input)
    rt := reflect.TypeOf(input)
    if rt.Kind() != reflect.Struct {
        return value, errors.New("input must be struct")
    }

    keyExist := false
    for i := 0; i < rt.NumField(); i++ {
        curField := rv.Field(i)
        if rt.Field(i).Name == key {
            switch curField.Kind() {
            case reflect.String, reflect.Int64, reflect.Int32, reflect.Int16, reflect.Int8, reflect.Int, reflect.Float64, reflect.Float32:
                keyExist = true
                value = curField.Interface()
            default:
                return value, errors.New("key must be int float or string")
            }
        }
    }
    if !keyExist {
        return value, errors.New(fmt.Sprintf("key %s not found in %s's field", key, rt))
    }
    return
}

  

測試:

func TestGetStructFiled(t *testing.T) {
	user1 := User{
		ID:   1,
		NAME: "aaa",
	}
	v, err := GetStructStringField(user1, "NAME")
	fmt.Println(v, err)
}

 

測試結果

aaa <nil>

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM