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 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!