Go 语言类型转换
Go 语言是一种强类型语言,类型转换是指将一个数据类型的值转换成另一个数据类型。Go 中有两种类型转换:显式类型转换和隐式类型转换。
- 显式类型转换:需要通过显式的语法来进行类型转换。
- 隐式类型转换:Go 语言并不支持隐式类型转换,所有类型转换都必须显式进行。
1. 显式类型转换
在 Go 中,显式类型转换是通过 type(value) 语法来实现的,type 是目标类型,value 是原始值。
1.1 基本类型转换
基本类型之间的转换,如整数、浮点数、布尔值、字符等。
示例:整数与浮点数之间的转换
package main
import "fmt"
func main() {
var a int = 10
var b float64 = float64(a) // 显式转换 int 到 float64
fmt.Println(b) // 输出: 10.0
}
示例:浮点数到整数的转换
package main
import "fmt"
func main() {
var a float64 = 9.99
var b int = int(a) // 显式转换 float64 到 int(会截断小数部分)
fmt.Println(b) // 输出: 9
}
示例:字符与数字之间的转换
package main
import "fmt"
func main() {
var char byte = 'A' // 字符 'A' 对应 ASCII 码 65
var num int = int(char) // 将字符转换为其对应的 ASCII 数字
fmt.Println(num) // 输出: 65
}
1.2 布尔值与数字的转换
Go 不支持直接将布尔值与数值类型相互转换。
// 以下代码会报错
// var b int = bool(true)
1.3 字符串与其他类型的转换
- 将
int或float转换为string,可以使用fmt.Sprintf或strconv包。 - 将
string转换为其他类型时,可以使用strconv包提供的函数。
示例:整数转字符串
package main
import "fmt"
import "strconv"
func main() {
var a int = 123
str := strconv.Itoa(a) // 将整数转为字符串
fmt.Println(str) // 输出: "123"
}
示例:字符串转整数
package main
import "fmt"
import "strconv"
func main() {
var s string = "456"
num, err := strconv.Atoi(s) // 将字符串转为整数
if err != nil {
fmt.Println("转换失败:", err)
} else {
fmt.Println(num) // 输出: 456
}
}
2. 结构体与接口的类型转换
Go 支持将结构体类型转换为接口类型(隐式实现接口)以及将接口类型转换为具体的结构体类型。
2.1 结构体转换为接口类型
一个结构体类型如果实现了接口类型的方法集,就可以隐式地赋值给该接口类型。
package main
import "fmt"
// 定义一个接口
type Speaker interface {
Speak() string
}
// 定义一个结构体
type Person struct {
Name string
}
// Person 实现 Speaker 接口的方法
func (p Person) Speak() string {
return "Hello, my name is " + p.Name
}
func main() {
var speaker Speaker
person := Person{Name: "John"}
speaker = person // 隐式转换为接口类型
fmt.Println(speaker.Speak()) // 输出: Hello, my name is John
}
2.2 接口转换为具体类型
可以使用 类型断言 来将接口类型转换为具体类型。类型断言的语法为:x.(T),其中 x 是接口变量,T 是目标类型。
示例:接口转为具体类型
package main
import "fmt"
type Speaker interface {
Speak() string
}
type Person struct {
Name string
}
func (p Person) Speak() string {
return "Hello, my name is " + p.Name
}
func main() {
var speaker Speaker
person := Person{Name: "John"}
speaker = person // 隐式转换为接口类型
// 使用类型断言将接口转换为具体类型
p, ok := speaker.(Person) // ok 用于判断转换是否成功
if ok {
fmt.Println("转换成功:", p.Name) // 输出: 转换成功: John
} else {
fmt.Println("转换失败")
}
}
2.3 空接口与类型断言
Go 语言中的空接口 interface{} 可以容纳任何类型的数据。通过类型断言可以将空接口转换为具体类型。
package main
import "fmt"
func printType(i interface{}) {
switch v := i.(type) {
case int:
fmt.Println("int 类型:", v)
case string:
fmt.Println("string 类型:", v)
default:
fmt.Println("未知类型")
}
}
func main() {
printType(42) // 输出: int 类型: 42
printType("hello") // 输出: string 类型: hello
printType(3.14) // 输出: 未知类型
}
3. 类型转换的限制
- 不支持隐式转换:Go 语言不支持隐式类型转换,必须使用显式转换。
- 结构体和接口之间的转换需要实现接口:结构体只能转换为实现了接口的类型。
- 接口的类型断言:接口类型必须通过类型断言显式转换为具体类型。
4. 总结
- 显式类型转换:使用
type(value)语法进行类型转换,适用于基本类型、字符串与其他类型之间的转换。 - 结构体与接口的类型转换:结构体可以隐式赋值给接口类型,接口类型可以通过类型断言转换为具体类型。
- 空接口的使用:空接口
interface{}可以存储任何类型的数据,结合类型断言实现不同类型之间的转换。