类型转换
显示转换
Go 语言不存在隐式类型转换,因此所有的类型转换都必须显式的声明
type_name(expression)
数值类型转换
类型转换只能在定义正确的情况下转换成功,例如从一个取值范围较小的类型转换到一个取值范围较大的类型(将 int16 转换为 int32)。当从一个取值范围较大的类型转换到取值范围较小的类型时(将 int32 转换为 int16 或将 float32 转换为 int),会发生精度丢失(截断)的情况
只有相同底层类型的变量之间可以进行相互转换(如将 int16 类型转换成 int32 类型),不同底层类型的变量相互转换时会引发编译错误(如将 bool 类型转换为 int 类型)
var a int = 10
var b float64 = float64(a)
字符串类型转换
var str string = "10"
var num int
num, _ = strconv.Atoi(str)
类型断言
类型断言用于将接口类型转换为指定类型,其语法如下
value.(T)
其中 value 是接口类型的变量,T 是要转换成的类型
package main
import "fmt"
func main() {
var i interface{} = "Hello, World"
str, ok := i.(string)
if ok {
fmt.Printf("'%s' is a string\n", str)
} else {
fmt.Println("conversion failed")
}
}
interface{}
在 Go 语言中,interface{} 类型被称为空接口(Empty Interface),它是一种特殊的接口类型,可以表示任意类型的值。由于 interface{} 可以包含任意类型的值,因此它在某种程度上可以看作是一个通用容器,可以存储不同类型的数据
在 Go 中,一个变量被赋值给空接口时,编译器会将该变量的静态类型信息也保存在接口值中。在运行时,可以使用类型断言(Type Assertion)来判断接口变量是否包含特定的类型,并将其转换为具体类型。这种机制允许在不提前指定具体类型的情况下,将不同类型的值存储在同一个容器中,并在需要时进行类型转换