Skip to content

Go 类型转换

在 Go 中,将值从一种类型转换为另一种类型称为 类型转换 (type conversion)。与一些允许某些类型之间隐式转换(如 int 到 float)的语言不同,Go 要求转换必须是显式 (explicit) 的。

这意味着必须显式地指定要转换成的类型。这种设计选择增强了代码的清晰度,并防止了因意外的自动转换而引起的潜在错误。

类型转换的语法很简单:

TargetType(expression)

其中 TargetType 是要转换成的类型,expression 是要转换的值或变量。

常见转换场景 (Common Conversion Scenarios)

Section titled “常见转换场景 (Common Conversion Scenarios)”
  1. 数值转换 (Numeric Conversions): 在不同的整数类型之间或整数类型与浮点类型之间进行转换。
var i int = 42
var f float64 = float64(i) // 将 int 转换为 float64
var u uint = uint(i) // 将 int 转换为 uint
var fLarge float64 = 12345.678
var iTruncated int = int(fLarge) // 将 float64 转换为 int(小数部分被丢弃)
fmt.Println(i, f, u) // 输出: 42 42 42
fmt.Println(fLarge, iTruncated) // 输出: 12345.678 12345

注意: 从较大类型转换为较小类型(例如,int64 到 int32)或从浮点类型转换为整数类型时,如果值超出目标类型的范围,可能会导致截断 (truncation) 或数据丢失。

  1. 整数除法 (Integer Division): 对整数执行浮点除法。

如果除两个整数,Go 会执行整数除法,丢弃余数。

sum := 17
count := 5
resultInt := sum / count // 整数除法: resultInt 是 3

要获得浮点结果,在除法之前将一个或两个操作数转换为浮点类型:

package main
import "fmt"
func main() {
var sum int = 17
var count int = 5
var mean float64
// 在除法前将整数转换为 float64
mean = float64(sum) / float64(count)
fmt.Printf("Value of mean: %f\n", mean)
}

输出:

Value of mean: 3.400000
  1. 涉及 byte 和 rune 的转换: 在整数、byte (uint8) 和 rune (int32) 之间进行转换。
var char byte = 'A' // byte 是 uint8 的别名
var code int = int(char)
fmt.Printf("Character: %c, Code: %d\n", char, code) // 输出: Character: A, Code: 65
var r rune = '世' // rune 是 int32 的别名
var rCode int = int(r)
fmt.Printf("Rune: %c, Code: %d\n", r, rCode) // 输出: Rune: 世, Code: 19990

何时不允许转换 (When Conversions Are Not Allowed)

Section titled “何时不允许转换 (When Conversions Are Not Allowed)”

不能使用这种基本的转换语法直接在不兼容的类型之间进行转换,例如 int 和 string,或 bool 和 int。对于这些场景,通常使用标准库包 (standard library packages) 中的函数,例如 strconv(用于字符串转换)。

var num int = 100
// var str string = string(num) // 编译时错误: cannot convert num (type int) to type string
// 使用 strconv 包的正确方法:
import "strconv"
var str string = strconv.Itoa(num) // Itoa: 整数转 ASCII (string)
fmt.Println(str) // 输出: "100"

类型转换是 Go 中用于管理不同表示形式数据同时保持类型安全的基本操作。