【发布时间】:2018-04-21 14:39:36
【问题描述】:
我有以下https://play.golang.org/p/TlHCX29QZr
package main
import (
"fmt"
"reflect"
)
type A struct {
Name string
Age int
}
func change(a interface{}) {
aa := reflect.Indirect(reflect.ValueOf(a))
for i := 0; i < aa.NumField(); i++ {
field := aa.Field(i)
switch field.Interface().(type) {
case string:
field.Set(reflect.ValueOf("fred"))
case int:
field.Set(reflect.ValueOf(54))
default:
fmt.Println("unknown field")
}
}
}
func main() {
a := &A{"bob", 120}
b := []*A{}
c := []struct {
Alias string
Months int
}{}
d := []struct {
First string
Years int
}{
{"james", 22},
{"ricky", 32},
{"bobby", 12},
{"rachel", 82},
}
change(a)
fmt.Println(a) // want &A{"fred", 54}
change(b)
fmt.Println(b) // want []*A{&A{"fred", 54}}
change(c)
fmt.Println(c) // want []struct{struct{"fred", 54}}
change(d)
fmt.Println(d) // want []struct{struct{"fred", 54}, struct{"fred", 54}, struct{"fred", 54}, struct{"fred", 54}}
}
如您所见,有些变量是空切片,有些则不是。对于那些为空的,我需要添加 1 个结构 {"fred", 54}。对于那些不为空的切片,我需要将所有值更改为 {"fred", 54}。我事先不知道这些字段是什么......只是如果有一个字符串字段,则值应该是“fred”,如果一个 int 字段是 54。
我能够更改“a”的值,但其他一切都失败了,因为“恐慌:反映:在切片值上调用 reflect.Value.NumField”。我不知道该去哪里。谢谢!
【问题讨论】:
-
你传入了两个不同的
reflect.Kinds,结构和切片,如果切片你不能使用NumField,你必须遍历它的内容,确保那些是结构和那么你可以在这些上拨打NumField。 -
逻辑上你还想在这里做两件不同的事情。在 b 和 c 中,如果切片为空,您希望“附加”一个值,而在另一个中,您希望修改值。
-
@mkopriva 如何遍历一片空的匿名结构来获取字段名称?
标签: go