亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

golang:如何在界面中檢查導出的字段

golang:如何在界面中檢查導出的字段

Go
慕工程0101907 2022-11-08 15:23:11
精簡版:import (    "fmt"    "reflect")type StatusVal inttype Foo struct {    Name string    Age  int    art  string}func ListFields(a interface{}) {    v := reflect.ValueOf(a).Elem()    fmt.Printf(" Kind: %+v \n", v.Type())    for _, f := range reflect.VisibleFields(v.Type()) {        if f.IsExported() {            fmt.Printf(" Kind: %+v \n", f)        } else {            fmt.Printf(" Kind: %s \n", f.Name)        }    }}func main() {    var x Foo    ListFields(&x)}這段代碼有效,但我真正需要的是var x []Foo,我找不到一種方法讓它工作并在結構切片的字段中檢查 IsExported。長版:我正在尋找生成一個通用的 sqlToStruct 函數,我遇到了這個很棒的答案: Generalizing *sql.Rows Scan in Go我沒有在那里回復的聲譽。唯一的問題是,如果我的結構有任何未導出的字段,它就會恐慌,我想檢查一下并返回一個要處理的錯誤,而不是讓它恐慌。另外:我在 go 中編碼的時間很短,如果我遺漏了一些絕對明顯的東西,請理解我來自哪里,并抱歉。
查看完整描述

1 回答

?
哆啦的時光機

TA貢獻1779條經驗 獲得超6個贊

func ListFields(a interface{}) {

    rt := reflect.TypeOf(a) // take type of a

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

        rt = rt.Elem() // use Elem to get the pointed-to-type

    }

    if rt.Kind() == reflect.Slice {

        rt = rt.Elem() // use Elem to get type of slice's element

    }

    if rt.Kind() == reflect.Ptr { // handle input of type like []*StructType

        rt = rt.Elem() // use Elem to get the pointed-to-type

    }

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

        return

    }


    fmt.Printf(" Kind: %+v \n", rt)

    for _, f := range reflect.VisibleFields(rt) {

        if f.IsExported() {

            fmt.Printf(" Kind: %+v \n", f)

        } else {

            fmt.Printf(" Kind: %s \n", f.Name)

        }

    }

}

https://go.dev/play/p/0J3VXmFPe87


查看完整回答
反對 回復 2022-11-08
  • 1 回答
  • 0 關注
  • 113 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號