数据类型的转换在编程中经常用到,Go 语言中数据类型转换分为显式和隐式转换两种。理解转换方法可以避免许多错误。
本文将系统详细介绍 Go 语言各主要数据类型之间的显式和隐式转换规则、方法以及需要注意的细节。通过学习本文可以全面掌握 Go 语言数据类型转换的方式。
1
一、概述
Go 语言数据类型转换分两种:
- 隐式转换:Go 自动进行的默认转换。
- 显式转换:需要使用转换函数进行强制转换;
2
二、整型转换
整型之间可以互相转换,但需要遵守数据范围限制:
var i int16 = 100 var j int8 j = int8(i) // 显式转换
超出类型范围则取模:
var i int16 = 128 var j int8 j = int8(i) // j == -128
3
三、浮点数转换
浮点数转换规则:
- 转换成功时直接转换
- 越界时转换为±Inf
- 精度损失时直接截断
示例:
var f float64 = 1.5 var i int8 = int8(f) // i == 1
4
四、其他整型转换
其他整型类型均可以转换为 int:
var b byte = 'A' var i int = int(b)
但反向转换时需要范围判断。
5
五、interface{}转换
interface{}可以存储任意类型,转换时需判断类型:
var a interface{} = 100 v, ok := a.(int) if ok { fmt.Println(v) }
类型断言转换失败则 ok 为 false。
6
六、string 与其他转换
string 转换为其他:
s := strconv.Itoa(123) // int to string f, _ := strconv.ParseFloat("1.5", 64) // string to float64
其他类型转换为 string:
i := 100 s := strconv.Itoa(i)
需要使用 strconv 包进行转换。
7
七、切片转换
切片不能直接转换为其他类型,但可以转换为[]byte 或自己:
var s1 []int = []int{1, 2, 3} var s2 []byte = []byte(s1) // 可行 var s3 []string = s1 // 错误,不能转换
8
八、Map 转换
map 只能转换为自身(map)或转换为 interface{}:
var m1 map[string]int = map[string]int{ "a": 1, "b": 2, } var m2 interface{} = m1 var m3 map[string]int = m1 // 可行
map 到其他类型直接转换会编译错误。
9
九、指针转换
Go 不支持指针间的直接转换,但可以通过先获取值再赋值的方式实现转换。
var a *int = new(int) var b *float64 = a // 错误
但可以通过获取指针的值进行转换:
var a *int = new(int) *a = 100 var b *float64 = new(float64) *b = float64(*a) //可行
10
总结
Go 语言中合理进行数据类型转换可以避免许多错误,需要注意每个类型之间的转换规则。显式转换可以避免意外的隐式转换。
通过学习本文,我们可以全面掌握 Go 语言各种数据类型间的转换方法。这将有助于我们进行灵活的编程。
