Go 语言类型转换
                           
天天向上
发布: 2025-03-25 23:57:19

原创
748 人浏览过

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 字符串与其他类型的转换

  • intfloat 转换为 string,可以使用 fmt.Sprintfstrconv 包。
  • 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{} 可以存储任何类型的数据,结合类型断言实现不同类型之间的转换。

🔹 参考资料

发表回复 0

Your email address will not be published. Required fields are marked *