为了账号安全,请及时绑定邮箱和手机立即绑定

如何实现 GetStringValueByField

如何实现 GetStringValueByField

Go
吃鸡游戏 2021-08-23 16:34:54
我正在尝试实现一种方法,以从任意结构字段中获取值作为结构给出的字符串,并将字段名称作为字符串。随着反射它总是恐慌。恐慌:反映:调用reflect.Value.FieldByName接口值goroutine 16 [正在运行]// attempt to implement GetStringValueByFieldName()package mainimport "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 ""}
查看完整描述

1 回答

?
子衿沉夜

TA贡献1828条经验 获得超3个赞

以下是按名称获取字符串字段的方法:


package main


import (

    "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())

   }

}


查看完整回答
反对 回复 2021-08-23
  • 1 回答
  • 0 关注
  • 214 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信