go 语言中的类型转换分别为:断言、强制、显式、隐式。
类型断言#
最简单的断言表达式:var value = x.(T)
如果 x 不是 nil,且 x 可以转换成 T 类型,就会断言成功,返回 T 类型的变量 value 。如果 T 不是接口类型,则要求 x 的类型就是 T,如果 T 是一个接口,要求 x 实现了 T 接口。
如果断言类型成立,则表达式返回值就是 T 类型的 x,如果断言失败就会触发 panic。
上述表所示再断言失败就会 panic,go 提供了另外一种带返回是否成立的断言语法:
s, ok := x.(T)
该方法和第一种差不多一样,但是 ok 会返回是否断言成功不会出现 panic,ok 就表示是否是成功了。
也可通过Switch进行断言
1
2
3
4
5
6
7
8
|
switch i:= x.(type){
case nil:
xxx
case int:
xxx
case bool:
xxx
}
|
CVT包#
开源地址:https://github.com/shockerli/cvt
安装:
1
|
$ go get -u github.com/shockerli/cvt
|
支持传入任意类型数据,不用考虑panic
具体使用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
// 返回是否转换出现error
cvt.IntE("12") // 12, nil
cvt.BoolE("false") // false, nil
// 忽略错误
cvt.Int(struct{}{}) // 0(failed)
// 错误时返回默认值
cvt.Int(struct{}{}, 12) // 12
// 支持自定义类型
type Name string
var name Name = "jioby"
cvt.StringE(name) // jioby, nil
// 支持引用
var name = "jioby"
cvt.StringE(&name) // jioby, nil
|