[英]Generically modify struct fields using reflection in golang
下面是一個使用反射 package 修改結構字段的方法,這適用於特定的結構類型
func modify(obj Car) interface{} {
ty := reflect.TypeOf(obj)
for i := 0; i < ty.NumField(); i++ {
rval := reflect.Indirect(reflect.ValueOf(&obj))
field := rval.Field(i)
fieldType := field.Kind()
switch fieldType {
case reflect.String:
field.SetString("")
case reflect.Int:
field.SetInt(0)
case reflect.Ptr:
field.Set(reflect.ValueOf(nil))
}
}
return obj
}
修改簽名為
func modify(obj interface{}) interface{} {
導致恐慌:反映:在接口值上調用 reflect.Value.Field
在線
field := rval.Field(i)
https://go.dev/play/p/pGfKtIg5RUp它與簽名一起使用
func modify(obj Car) interface{} {
https://go.dev/play/p/31Oh6WLmlGP
為什么編譯時類型會修改行為? 這里的目標是根據結構標簽屏蔽某些字段。它可以包裝一個端點,輸入和 output 到被包裝的方法可以是結構或指針,所以在上面的情況下,兩個調用都應該工作
modify(car)
modify(&car)
這就是它對值和指針類型的工作方式
func modify(obj interface{}) interface{} {
rv := reflect.ValueOf(obj)
trv := reflect.TypeOf(obj)
value := reflect.New(rv.Type())
if rv.Kind() == reflect.Pointer {
rv = reflect.ValueOf(obj).Elem()
trv = reflect.TypeOf(obj).Elem()
value = reflect.New(rv.Type())
}
for i := 0; i < rv.NumField(); i++ {
field := rv.Field(i)
fieldType := field.Kind()
v := value.Elem().Field(i)
tag, _ := trv.Field(i).Tag.Lookup("es")
if len(tag) != 0 {
switch fieldType {
case reflect.String:
v.SetString(tag)
case reflect.Int:
v.SetInt(0)
case reflect.Ptr:
v.Set(reflect.ValueOf(nil))
}
} else {
v.Set(field)
}
}
return value
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.