1 回答

TA貢獻1784條經驗 獲得超9個贊
您必須自己編寫代碼,并進行反思。
這是一個演示函數,可打印您提供的輸出:
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
}
將打印:
[Example.Foo Example.Bar Example.Baz.A Example.Baz.B Example.Qux.0 Example.Qux.1]
注意:
反射會帶來性能損失;如果您對此感到擔憂,您應該分析相關的代碼路徑以查看它是否會破壞交易
上面的代碼是人為的,例如它不處理地圖,它不處理
nil
等等;你可以自己擴展它在您想要的輸出中,將打印切片/數組字段的索引。切片沒有數組的固有長度。為了知道切片的長度,您必須使用
reflect.Value
. 這個 IMO 使代碼更加尷尬。如果您可以接受不打印切片索引,那么您可以使用reflect.Type
.
游樂場: https: //play.golang.org/p/isNFSfFiXOP
- 1 回答
- 0 關注
- 104 瀏覽
添加回答
舉報