Skip to content

Go 的类型 switch ​

视角:本文聚焦接口动态类型分支;普通表达式 switch 与控制流行为见switch 语句笔记。 类型 switch 是 Go 语言的一种特殊的 switch 语句,用于根据接口值的动态类型进行分支。它常用于处理未知类型的接口变量,使代码能够根据实际类型执行不同的操作。

类型 switch 的语法 ​

类型 switch 的语法:

go
switch v := i.(type) {
case T1:
    // v 是 T1 类型
case T2:
    // v 是 T2 类型
default:
    // v 是其他类型
}
  • i.(type):用于提取接口 i 的动态类型。
  • v:在每个 case 中,v 是接口 i 的具体类型的值。
  • T1,T2:具体类型。

示例代码 ​

对同一个接口值按类型分派:

go
package main

import (
    "fmt"
)

func doSomething(i interface{}) {
    switch v := i.(type) {
    case int:
        fmt.Printf("int value: %d\n", v)
    case string:
        fmt.Printf("string value: %s\n", v)
    case bool:
        fmt.Printf("bool value: %t\n", v)
    default:
        fmt.Printf("unknown type: %T\n", v)
    }
}

func main() {
    doSomething(10)
    doSomething("hello")
    doSomething(true)
    doSomething(3.14)
}

输出:

int value: 10
string value: hello
bool value: true
unknown type: float64

类型 switch 的工作原理 ​

  1. 接口变量:类型 switch 的操作对象必须是接口变量,因为只有接口变量才具有动态类型。
  2. 类型判断:switch 语句中的 type 关键字用于获取接口变量的动态类型。
  3. 分支匹配:根据动态类型匹配到对应的 case 语句,如果没有匹配到任何 case,则执行 default 分支。
  4. 类型断言:在每个 case 语句中,可以将接口变量断言为具体类型,并将其赋值给在 switch 语句中声明的变量。

类型 switch 的应用场景 ​

类型 switch 用在拿到接口值、要按具体类型分派的场合,常见三种:

  1. 日志记录:日志消息是字符串、error 还是结构体,处理方式不同,用类型 switch 分开走。
  2. 泛型编程:在实现一些泛型数据结构或算法时,类型 switch 可以用于处理不同类型的元素。
  3. 接口实现检测:在实现某些接口时,可以使用类型 switch 检查传入参数的具体类型,并进行不同的处理。

类型 switch 与普通 switch 的对比 ​

  • 普通 switch:普通的 switch 语句用于根据变量的值进行分支。
  • 类型 switch:类型 switch 用于根据接口变量的动态类型进行分支。

示例对比:

普通 switch:

go
package main

import "fmt"

func main() {
    var x = 10
    switch x {
    case 1:
        fmt.Println("One")
    case 2:
        fmt.Println("Two")
    case 10:
        fmt.Println("Ten")
    default:
        fmt.Println("Unknown")
    }
}

类型 switch:

go
package main

import "fmt"

func main() {
    var i interface{} = 10
    switch v := i.(type) {
    case int:
        fmt.Println("int value:", v)
    case string:
        fmt.Println("string value:", v)
    default:
        fmt.Println("unknown type")
    }
}

总结 ​

类型 switch 解决一件事:接口值到手却不知道动态类型,用 switch v := i.(type) 按类型分派,v 在每个 case 里就是该类型的值。与普通 switch 的差别只在分支条件,一个看值,一个看类型。

参考资料 ​

相关页面 ​

Hello Golang