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