https://stackoverflow.com/questions/39011295/when-does-reflect-isvalid-return-false
总结成一句话:IsValid 表示是否 Value 是否 wrap 了一个值。
reflect.IsValid()
在接收者是零值的时候返回 false,大多数函数/方法永远不会返回无效值。
IsValid 方法的目的是报告 reflect.Value 本身是否有效,而不是其 wrap 的值是否有效。
下面所有的例子都返回 false(除非特殊说明)。
- 在结构体 reflect.Value 的零值上调用 IsValid
fmt.Println(reflect.Value{}.IsValid())
- 向 ValueOf 传递 nil。
fmt.Println(reflect.ValueOf(nil).IsValid())
注意下面这种返回 true。
fmt.Println(reflect.ValueOf((*int)(nil)).IsValid())
- 从空指针开始,试图访问指针指向的值。
Elem()
和Indirect()
均可访问指向的值。
fmt.Println(reflect.ValueOf((*int)(nil)).Elem().IsValid())
fmt.Println(reflect.Indirect(reflect.ValueOf((*int)(nil))).IsValid())
- 访问不存在的结构体成员或方法
s := struct{}{}
fmt.Println(reflect.ValueOf(s).FieldByName("").IsValid())
fmt.Println(reflect.ValueOf(s).MethodByName("").IsValid())
- 试图访问 Map 中不存在的 key
m := map[int]int{}
fmt.Println(reflect.ValueOf(m).MapIndex(reflect.ValueOf(3)).IsValid())