如何将自定义类型转换为var documents= new List<ElasticSearchProject> {...};
client.IndexMany(documents);
然后转换为基本类型(例如interface{}
)?
我不能像uint8
那样使用直接转换,因为我可能不知道所有自定义类型,但我可以在运行时确定基类型(uint16(val.(Year))
,uint8
,...)
有很多自定义类型(通常用作枚举)基于数字:
例如:
uint32
依旧......
问题是关于从type Year uint16
type Day uint8
type Month uint8
到基类型的类型转换:
interface{}
答案 0 :(得分:13)
您可以使用reflect
包完成此操作:
package main
import "fmt"
import "reflect"
type Year uint16
func AsUint16(val interface{}) uint16 {
ref := reflect.ValueOf(val)
if ref.Kind() != reflect.Uint16 {
return 0
}
return uint16(ref.Uint())
}
func main() {
fmt.Println(AsUint16(Year(2015)))
}
根据您的具体情况,您可能希望返回(uint16, error)
,而不是返回空值。
答案 1 :(得分:4)
为什么在问题中包含Year
?您是希望将任意事物转换为年份,还是将年份转换为uint16s?
如果我认为你的意思是后一种情况,那么最好使用方法
func (y Year) AsUint16() uint16 {
return uint16(y)
}
,不需要任何类型的断言或反思。