在Go的类型转换中,不同于其他语言,任何的类型之间都没有隐形的转换。在写代码的过程中,我们经常会用到以下一些互相转换
同类型的操作不成功是因为语言特性,总是要保证操作符两边的类型是一样的才可以,在转换的过程中有以下两种方式:
var foo = 5
// type convert 1: int -> float64
var bar1 = float64(foo)
fmt.Printf("%v\n", bar1)
// type convert 2: int -> string
var bar2 = strconv.Itoa(foo)
fmt.Printf("%v\n", bar2)
可以看到有2个不同的转换方式,先说strconv,主要是string与基础类型(int、float、bool、特殊符号)的转换,以上我们还可以想到如果以下写法
var foo bool = 1
// wrong
var bar = int(foo)
fmt.Printf("%v", bar)
这个写法是会报错的,会提示“cannot convert foo (type bool) to type int”,也就是说有些类型之前不能这么去转
断言是个相对高级的转换,当转换对象是一个interface{}时,可以通过y.(type)来进行转换,详见https://golang.google.cn/ref/spec#Type_assertions
var y interface{} = 7 // y has dynamic type int and value 7
i := y.(int) // i has type int and value 7
fmt.Printf("%v\n", i)
其中,这里有个细节会导致会不会触发panic:
//安全类型断言,失败value则为类型T对应的零值
value,ok := y.(type)
//非安全类型断言,失败时会panic()
value := y.(type)
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。