如何实现 GetStringValueByField

我正在尝试实现一种方法,以从任意结构字段中获取值作为结构给出的字符串,并将字段名称作为字符串。


随着反射它总是恐慌。


恐慌:反映:调用reflect.Value.FieldByName接口值goroutine 16 [正在运行]


// attempt to implement GetStringValueByFieldName()

package main


import "fmt"


import "reflect"

import "strconv"


func main() {


    a:=Order{A:"asdf", B:123}

    fmt.Println(a)

    fmt.Println(Test1(a, "A"))

    fmt.Println(Test1(a, "B"))

}


type Order struct {

    A  string

    B  int64

}

func Test1 (n interface{}, field_name string) string {

    var x string

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

    x, ok := s.FieldByName(field_name).Interface().(string)

    if ok {

        fmt.Println(ok)

    }

    return x

}


func GetStringValueByFieldName(n interface{}, field_name string) string {

    ps := reflect.ValueOf(&n)

    // struct

    s := ps.Elem()

    if s.Kind() == reflect.Struct {

        f := s.FieldByName(field_name)

        if f.IsValid() {

        if f.CanSet() {

                if f.Kind() == reflect.Int {

                    return strconv.FormatInt(f.Int(),10)

                }

                if f.Kind() == reflect.String {

                    return f.String()

                }

        }

    }

    }

    return ""

}


吃鸡游戏
浏览 218回答 1
1回答

子衿沉夜

以下是按名称获取字符串字段的方法:package mainimport (    "fmt"    "reflect")func main() {    a := Order{A: "asdf", B: 123}    fmt.Println(a)    fmt.Println(GetStringValueByFieldName(a, "A"))    fmt.Println(GetStringValueByFieldName(&a, "A"))    fmt.Println(GetStringValueByFieldName(a, "B"))    fmt.Println(GetStringValueByFieldName(0, "B"))    fmt.Println(GetStringValueByFieldName(a, "C"))}type Order struct {    A string    B int64}func GetStringValueByFieldName(n interface{}, field_name string) (string, bool) {    s := reflect.ValueOf(n)    if s.Kind() == reflect.Ptr {        s = s.Elem()    }    if s.Kind() != reflect.Struct {        return "", false    }    f := s.FieldByName(field_name)    if !f.IsValid() {        return "", false    }    switch f.Kind() {    case reflect.String:        return f.Interface().(string), true    case reflect.Int:        return strconv.FormatInt(f.Int(), 10), true    // add cases for more kinds as needed.    default:        return "", false        // or use fmt.Sprint(f.Interface())   }}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go