Golang作为强类型语言,不同类型之间的赋值和操作有严格的限制,很多时候我们需要手动进行类型转换来满足业务需求。下面我们就来详细了解Golang中类型转换的各类场景和实现方法。

基础类型之间的直接转换
对于数值类型、字符串类型等基础类型,如果是兼容的类型,可以直接使用Type(value)的语法进行转换,转换时需要注意目标类型的取值范围,避免数据溢出。
常见的基础类型转换示例如下:
package main
import "fmt"
func main() {
// int转float64
var a int = 10
var b float64 = float64(a)
fmt.Printf("int转float64结果: %v, 类型: %T\n", b, b)
// float64转int,会直接截断小数部分
var c float64 = 10.89
var d int = int(c)
fmt.Printf("float64转int结果: %v, 类型: %T\n", d, d)
// int转int64
var e int = 20
var f int64 = int64(e)
fmt.Printf("int转int64结果: %v, 类型: %T\n", f, f)
}interface的类型断言
当我们需要把interface{}类型的变量转换为具体类型时,就需要用到类型断言,语法是value, ok := interfaceVar.(TargetType),其中ok是布尔值,表示转换是否成功,避免转换失败导致程序panic。
类型断言的使用示例如下:
package main
import "fmt"
func main() {
var i interface{} = "hello"
// 安全类型断言,带ok判断
s, ok := i.(string)
if ok {
fmt.Printf("类型断言成功,值为: %s\n", s)
} else {
fmt.Println("类型断言失败")
}
// 不带ok的类型断言,失败会panic
// num := i.(int) // 这行执行会直接panic
}字符串与数值类型的转换
Golang中字符串和数值类型的互相转换不能直接用强制转换语法,需要借助strconv标准库来实现,这也是开发中非常常用的场景。
数值转字符串
可以使用strconv.FormatInt、strconv.FormatFloat等函数,也可以用strconv.Itoa快速转换int类型到字符串。
package main
import (
"fmt"
"strconv"
)
func main() {
// int转字符串
num := 123
str1 := strconv.Itoa(num)
fmt.Printf("int转字符串结果: %s, 类型: %T\n", str1, str1)
// float64转字符串,参数分别是值、格式、精度、位大小
f := 10.567
str2 := strconv.FormatFloat(f, 'f', 2, 64)
fmt.Printf("float64转字符串结果: %s, 类型: %T\n", str2, str2)
}字符串转数值
可以使用strconv.Atoi转换字符串到int,用strconv.ParseFloat等函数转换到对应数值类型,这些函数会返回转换结果和错误,需要处理错误情况。
package main
import (
"fmt"
"strconv"
)
func main() {
// 字符串转int
str1 := "456"
num1, err := strconv.Atoi(str1)
if err != nil {
fmt.Printf("转换失败: %v\n", err)
} else {
fmt.Printf("字符串转int结果: %d, 类型: %T\n", num1, num1)
}
// 字符串转float64
str2 := "78.90"
num2, err := strconv.ParseFloat(str2, 64)
if err != nil {
fmt.Printf("转换失败: %v\n", err)
} else {
fmt.Printf("字符串转float64结果: %f, 类型: %T\n", num2, num2)
}
}类型转换的注意事项
- 不同底层类型即使定义相同也不能直接转换,比如
type MyInt int和int是不同的类型,转换需要显式写int(myIntVar) - 浮点数转整数时会直接截断小数部分,不会做四舍五入,需要四舍五入的话要自己实现逻辑
- 类型断言只能用于interface类型,普通具体类型使用类型断言会编译报错
- 字符串转数值时如果字符串格式不符合要求,会返回错误,一定要处理错误避免程序异常
| 转换场景 | 实现方式 | 注意点 |
|---|---|---|
| 基础数值类型互转 | Type(value)语法 | 注意取值范围,避免溢出 |
| interface转具体类型 | 类型断言 value, ok := i.(T) | 建议带ok判断避免panic |
| 字符串和数值互转 | strconv库相关函数 | 需要处理转换错误 |