键入自定义类型到基本类型

时间:2015-06-08 20:35:52

标签: go

如何将自定义类型转换为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{}

http://play.golang.org/p/cyAnzQ90At

2 个答案:

答案 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),而不是返回空值。

https://play.golang.org/p/sYm1jTCMIf

答案 1 :(得分:4)

为什么在问题中包含Year?您是希望将任意事物转换为年份,还是将年份转换为uint16s?

如果我认为你的意思是后一种情况,那么最好使用方法

func (y Year) AsUint16() uint16 { 
    return uint16(y)
}

,不需要任何类型的断言或反思。

https://play.golang.org/p/9wCQJe46PU