在日常编程中,类型转换是经常需要用到的。因此本文将总结归纳一下Go语言中常见的一些类型转换。
Go语言中的类型转换可以有多种分类方式:
比如按照是否需要声明,可以分为:隐式类型转换和显式类型转换。
可以再根据使用场景划分为3种:显式类型转换、隐式类型转换和断言。(很多地方这里分出来4种,多了一个强制类型转换,但我认为显式类型转换和强制类型转换应该就是一回事。期待大佬解答一下这里他们的分类依据)
再或按照转换方向,比如从整数类型到浮点数类型的转换,或者从浮点数类型到整数类型的转换… …
本文将学习归纳使用场景分类下的情况。
就是直接强转,可能会导致数据丢失或溢出。
newType := targetType(expression)
其中,newType是要转换的目标类型,targetType是要转换为的类型,expression是要转换的表达式或变量。
例如:
x := 10
y := float64(x)
float64(x)将整数x转换为浮点数类型,并将结果赋值给变量y。
隐式类型转换主要出现在接口处,eg:
package main
import "fmt"
type Animal interface {
Sound()
}
type Dog struct {
Breed string
}
func (d Dog) Sound() {
fmt.Println("Woof!")
}
func demo2(a Animal) {
a.Sound()
}
func demo1(d1 interface{}) {
// 隐式类型转换——结构体类型转为接口类型
demo2(d1.(Animal))
}
func main() {
d1 := Dog{Breed: "滴滴滴"}
demo1(d1)
}
可以看到,这其中
日常使用中也可能碰见,比如:
func main() {
var x int = 10
var y float64 = x // 隐式类型转换,将整数类型转换为浮点数类型
fmt.Println(y) // 输出:10.0
}
简单来说相当于执行了一个判断逻辑,如果是A类型则正确,反之则强转为A类型,若转换成功则返回,不成功则报错。
通常使用以下语法进行断言:
value, ok := BInterface.(A)
其中,someInterface 是一个接口类型的值,A 是一个具体的类型。value 是转换后的值,ok 是一个布尔值,表示转换是否成功。如果转换成功,value 将包含转换后的值,ok 为 true;如果转换失败,value 将包含零值,ok 为 false。
具体讲解见此文。
个人认为日常使用中用的最多的是强制类型转换,亦可通过函数诸如Atoi
, Itoa
等。
隐式类型转换主要发生在使用接口时,尤其需要注意看得懂。
断言使用在一些附带有判断的场景。诸如一个kafka消息接收时候断言为[]byte类型。