自定义类型
使用 type
关键字来定义类型。格式为 type name <Type>
// 使用type自定义枚举类型
// 自定义了新类型State,实质是 int
type State int
// 定义枚举常量
const (
Pending State = 0
Success State = 1
Failed State = 2
Deleted State = 3
)
// 状态判断
func checkState(s State) {
switch s {
case Pending:
fmt.Println("Pending")
case Success:
fmt.Println("Success")
case Failed:
fmt.Println("Failed")
case Deleted:
fmt.Println("Deleted")
default:
fmt.Println("Error Type")
}
}
一般的类型转换
在已知需要转换的类型和目标类型下,可以使用 newValue := Type(oldValue)
。
var a int32 = 333
b := int64(a)
当然,对于一些已知类型的复杂一些的转换,可以使用相应包里的方法进行转换。
类型断言和类型转换
如何不知道需要转换的oldValue的值,那怎么办呢。
比如你从一个API接口接收到了一个值,但是其定义的是interface{},现在你需要对这个值进行操作,但是因为类型不确定,就没有办法用相应类型的一些方法了。
这时候就可以用类型断言和转换了。
value.(type)
会对interface{}值的value作一个判断,返回一个确定的类型。
v, ok := value.(Type)
,Type 是具体的类型,会将value转换成Type类型存储到v中,ok是表示转换是否成功的布尔值。
一般是配合switch语句进行操作。
switch v.(type) {
case bool:
v, ok = v.(bool)
if !ok {
fmt.Println("类型转换失败")
}
case int:
v, ok = v.(int)
// deal with ok
case string:
v, ok = v.(string)
// deal with ok
default:
xxx
}