1 回答

TA貢獻(xiàn)1784條經(jīng)驗(yàn) 獲得超9個(gè)贊
您必須自己編寫代碼,并進(jìn)行反思。
這是一個(gè)演示函數(shù),可打印您提供的輸出:
package main
import (
"fmt"
"reflect"
"strconv"
)
type Example struct {
Foo string
Bar string
Baz struct{
A int
B string
}
Qux []string
}
func main() {
example := Example{Qux: []string{"a", "b"}}
t := reflect.ValueOf(example)
prefix := t.Type().Name()
fmt.Println(ToPathSlice(t, prefix, make([]string, 0)))
}
func ToPathSlice(t reflect.Value, name string, dst []string) []string {
switch t.Kind() {
case reflect.Ptr, reflect.Interface:
return ToPathSlice(t.Elem(), name, dst)
case reflect.Struct:
for i := 0; i < t.NumField(); i++ {
fname := t.Type().Field(i).Name
dst = ToPathSlice(t.Field(i), name+"."+fname, dst)
}
case reflect.Slice, reflect.Array:
for i := 0; i < t.Len(); i++ {
dst = ToPathSlice(t.Index(i), name+"."+strconv.Itoa(i), dst)
}
default:
return append(dst, name)
}
return dst
}
將打?。?/p>
[Example.Foo Example.Bar Example.Baz.A Example.Baz.B Example.Qux.0 Example.Qux.1]
注意:
反射會(huì)帶來(lái)性能損失;如果您對(duì)此感到擔(dān)憂,您應(yīng)該分析相關(guān)的代碼路徑以查看它是否會(huì)破壞交易
上面的代碼是人為的,例如它不處理地圖,它不處理
nil
等等;你可以自己擴(kuò)展它在您想要的輸出中,將打印切片/數(shù)組字段的索引。切片沒有數(shù)組的固有長(zhǎng)度。為了知道切片的長(zhǎng)度,您必須使用
reflect.Value
. 這個(gè) IMO 使代碼更加尷尬。如果您可以接受不打印切片索引,那么您可以使用reflect.Type
.
游樂場(chǎng): https: //play.golang.org/p/isNFSfFiXOP
- 1 回答
- 0 關(guān)注
- 114 瀏覽
添加回答
舉報(bào)