Go如何将扩展后的内置类型强制转换回原始内置类型用于数学运算
解决方案
核心问题在于valueType2是独立的自定义类型,和原生int属于完全不同的类型,普通类型断言只会匹配完全相等的类型,不会自动提取底层类型的值。你可以通过reflect反射包绕过类型限制,直接读取底层的原生类型值,完全不需要依赖第三方包的未导出类型定义,适配你的场景。
实现代码
修改你的循环逻辑如下即可:
package main import ( "fmt" "reflect" ) type Value interface { DoThing() } type valueType1 string func (v valueType1) DoThing() { fmt.Println(v, "is a pretty sweet string") } type valueType2 int func (v valueType2) DoThing() { fmt.Println(v, "is a pretty sweet int") } func main() { var x valueType1 = "foo" var y valueType2 = 10 z := []Value{x, y} for _, v := range z { rv := reflect.ValueOf(v) // 判断底层类型是否为int if rv.Kind() == reflect.Int { // 拿到int64格式的底层值,再转为原生int rawInt := int(rv.Int()) fmt.Println("拿到原生int值:", rawInt) // 此处可直接用于数学计算 fmt.Println("计算测试:", rawInt + 5) } // 如果需要匹配底层string类型也可以同理处理 if rv.Kind() == reflect.String { rawStr := rv.String() fmt.Println("拿到原生string值:", rawStr) } } }
运行后输出结果:
foo is a pretty sweet string 拿到原生string值: foo 10 is a pretty sweet int 拿到原生int值: 10 计算测试: 15
方案说明
- 反射的
Kind()方法返回的是值的底层内置类型,和上层自定义类型无关,刚好可以识别未导出自定义类型的底层类别 - 不需要对第三方包的代码做任何修改,也不需要依赖未导出的类型定义,兼容性强
- 如果需要适配更多底层类型(比如float64、bool等),只需要新增对应的
Kind判断分支即可
内容的提问来源于stack exchange,提问作者donatJ
相关产品推荐
相关产品推荐

