1 回答
TA贡献1828条经验 获得超6个赞
反映。类型有一个方法:Type.AssignableTo()
// AssignableTo reports whether a value of the type is assignable to type u.
AssignableTo(u Type) bool
因此,您可以使用它来简化您的函数:set()
func set(v reflect.Value, i interface{}) bool {
if !reflect.TypeOf(i).AssignableTo(v.Type()) {
return false
}
v.Set(reflect.ValueOf(i))
return true
}
输出将相同(在Go Playground上尝试):
After o1 set to aInt returned true: obj is type int content '456'
After o1 set to aString returned false: obj is type int content '456'
After o1 set to aUint returned false: obj is type int content '456'
After o2 set to aInt returned true: obj is type int content '456'
After o2 set to aString returned true: obj is type string content 'hello'
After o2 set to aUint returned true: obj is type uint content '123'
您也可以(另外)调用 Value.CanSet() 来检测某些“不可设置”的情况:
可以设置报告是否可以更改 v 的值。仅当 Value 可寻址且未通过使用未导出的结构字段获取时,才能更改该值。如果 CanSet 返回 false,则调用 Set 或任何特定于类型的 setter(例如,SetBool、SetInt)将会死机。
- 1 回答
- 0 关注
- 118 浏览
添加回答
举报
