Go中通过反射为自定义整数类型赋值的问题
解决Go反射为基于int的自定义类型字段赋值的问题
要解决这个问题,核心是通过反射将int值转换为对应的自定义类型实例后再完成赋值,具体实现步骤如下:
1. 判断字段是否为基于int的自定义类型
通过反射获取字段的底层类型(调用Underlying()方法),判断其是否为int类型:
fieldType := vField.Type() if fieldType.Underlying() == reflect.TypeOf(int(0)) { // 字段是基于int的自定义类型,执行后续赋值逻辑 }
2. 转换值并完成赋值
先对要赋值的interface{}值做类型断言,确保它是int类型,再通过反射创建自定义类型的实例并赋值:
// 获取待赋值的原始值 val := getInteger() // 类型断言,确保值为int类型 intVal, ok := val.(int) if !ok { // 处理类型不匹配的错误,比如返回error或打印日志 return fmt.Errorf("expected int, got %T", val) } // 创建对应自定义类型的reflect.Value实例 customVal := reflect.New(fieldType).Elem() customVal.SetInt(int64(intVal)) // 为结构体字段赋值 vField.Set(customVal)
完整示例代码
把上述逻辑整合到可运行的代码中:
package main import ( "fmt" "reflect" ) type Provider int func (enum *Provider) Scan(raw interface{}) error { *enum = Provider(raw.(int)) return nil } type Foo struct { Code Provider Value string } func getInteger() interface{} { return 1 } func main() { foo := &Foo{ Code: Provider(0), Value: "derp", } fValue := reflect.ValueOf(foo).Elem() vField := fValue.Field(0) fieldType := vField.Type() // 判断字段是否为基于int的自定义类型 if fieldType.Underlying() == reflect.TypeOf(int(0)) { val := getInteger() intVal, ok := val.(int) if !ok { fmt.Printf("error: value is not int, got %T\n", val) return } // 创建自定义类型实例并赋值 customVal := reflect.New(fieldType).Elem() customVal.SetInt(int64(intVal)) vField.Set(customVal) fmt.Printf("赋值成功:foo.Code = %v(类型:%T)\n", foo.Code, foo.Code) } else { fmt.Println("字段不是基于int的自定义类型") } }
扩展说明
- 如果自定义类型基于其他整数类型(如
int8、int64),只需修改reflect.TypeOf()中的基准类型,比如reflect.TypeOf(int64(0)),SetInt方法接受int64参数,可以兼容所有有符号整数类型。 - 若需要处理无符号整数类型(如
uint),则使用SetUint方法,并判断底层类型为对应无符号整数类型即可。
内容的提问来源于stack exchange,提问作者Woody1193
相关产品推荐
相关产品推荐

