go系列五:类型断言和类型转换
在Go
中,类型断言和类型转换刚开始很蒙蔽,绝得有必要探讨一下,这节我们专门来学习一下。
类型断言
var name interface{} = "zhang"
name1 := name.(string)
类型转换
name := []byte("hello world")
name1 := string(name)
类型断言
类型断言用于断言变量属于某种类型,而且类型断言只能发生在接口上
在上面的例子上,name
是一个interface{}类型,我们为其分配了一个字符串,
现在,我们可以认为name
实际上是一个string
,但是暴露给我们的接口是interface{}
。
如果我们想得到的原始类型name
我们可以断言它是一个字符串,并且这个断言返回它的原始string
类型。
也就是说类型断言时应该知道任何变量的底层类型,但情况并非如此
这就是类型断言表达式实际上返回第二个可选值的原因:
var name interface{} = "42"
name1, ok := name.(string)
第二个值ok
是一个布尔值,true
如果我们的断言是正确的,否则为假。
也就是说类型断言是在运行时执行的。
switch
当我们不确定是什么类型的时候,可以使用switch
var name interface{} = "zhang"
switch g := name.(type) {
case string:
fmt.Println("is string")
case int:
fmt.Println("is int")
default:
fmt.Println("sorry")
}
类型转换
类型转换用于将一种数据类型的变量转换为另外一种类型的变量。由于Go语言不存在隐式类型转换,因此所有的类型转换都必须显式的声明
var x, y int = 3, 4
z := float64(3) + 1.4
fmt.Println(x, y,z)
这里我们将int 类型转换成了float64类型,然后相加。
type myInt int
func (i myInt) AddOne() myInt { return i + 1}
func main() {
var i myInt = 4
fmt.Println(i.AddOne())
}
虽然我们声明了一个myInt类型时,但是其底层使用的是int
,所以可以进行相互转换
var i myInt = 4
intCode := int(i)
只有底层数据结构相同时,类型才能相互转换。 不同类型,我们需要借助其他方法进行转换
type person struct {
name string
age int
}
type child struct {
name string
age int
}
type pet {
name string
}
func main() {
bob := person{
name: "bob",
age: 15,
}
babyBob := child(bob)
fmt.Println(bob, babyBob)
}
上面例子中都具有相同的类型:
struct {
name string
age int
}
strconv
Go
语言中strconv
包实现了基本数据类型和其字符串表示的相互转换。Atoi()
函数用于将字符串类型的整数转换为int类型
s1 := "100"
i1, err := strconv.Atoi(s1)
Itoa()
函数用于将int类型数据转换为对应的字符串
i2 := 200
s2 := strconv.Itoa(i2)
[下一章我们学习一下 go的 常量]博客:go系列六:Constants
本作品采用《CC 协议》,转载必须注明作者和本文链接