1 回答

TA貢獻1784條經驗 獲得超7個贊
我想將此函數與任何結構一起使用...
您可以這樣做,但請注意它放棄了類型安全。此外,這樣做的唯一方法是允許使用任何類型的調用,而不僅僅是某種結構類型的任何類型,所以你必須檢查你得到的實際上是某種結構類型:
func structValues(item interface{}) {
if reflect.ValueOf(item).Kind() != reflect.Struct {
... do something here ...
}
進行了檢查——或者稍微推遲它,或者省略它以允許reflect恐慌——然后你需要reflect.ValueOf(&item).Elem()用更簡單的reflect.ValueOf(item).
如果您希望允許指向結構以及實際結構的指針,您可以通過使用reflect.Indirectfirst. 結果是:
func structValues(item interface{}) []string {
e := reflect.Indirect(reflect.ValueOf(item))
if e.Kind() != reflect.Struct {
panic("not a struct")
}
values := []string{}
for i := 0; i < e.NumField(); i++ {
fieldValue := e.Field(i).Interface()
values = append(values, fmt.Sprintf("%#v", fieldValue))
}
return values
}
reflect.Indirect如果您想確保調用者在有指針時執(zhí)行自己的間接操作,請忽略。
(注意panic這里不是很友好。如果你想要正確的調試,考慮直接用%vor打印結構%#v,或者更徹底的東西,spew 包。)
Go Playground 上的完整示例使用您type Item struct自己的鏈接。
- 1 回答
- 0 關注
- 130 瀏覽
添加回答
舉報