当前位置: 首页 > article >正文

golang switch v := data.(type)

switch v := data.(type) 语句中,case 后面的类型是用来匹配 data 的实际类型,而不是匹配 v 的值。这里的类型匹配是在运行时进行的。

让我通过一个例子详细解释:

func explainTypeSwitch(data interface{}) {
    // 这里的 data.(type) 是获取 data 的实际类型
    // v 只是一个变量,用于在各个 case 中使用对应类型的值
    switch v := data.(type) {
    case int:
        // case int 匹配的是 data 的类型是否为 int
        // 如果匹配成功,v 会被自动转换为 int 类型
        fmt.Printf("data 的类型是 int,v 的值是 %v\n", v)
    case string:
        // case string 匹配的是 data 的类型是否为 string
        // 如果匹配成功,v 会被自动转换为 string 类型
        fmt.Printf("data 的类型是 string,v 的值是 %v\n", v)
    default:
        fmt.Printf("未知类型:%T\n", v)
    }
}

func main() {
    var x interface{} = 42
    explainTypeSwitch(x)  // 输出:data 的类型是 int,v 的值是 42
    
    x = "hello"
    explainTypeSwitch(x)  // 输出:data 的类型是 string,v 的值是 hello
}

关键点说明:

  1. data.(type) 是一个特殊的语法,只能在 switch 语句中使用
  2. case 后面的类型是用来匹配 data 的实际类型
  3. v 是一个变量,它会在每个 case 中自动获取对应类型的值
  4. 你也可以省略变量 v,直接写成 switch data.(type),如果你不需要使用这个值:
switch data.(type) {
case int:
    fmt.Println("It's an integer")
case string:
    fmt.Println("It's a string")
}

也可以在一个 case 中匹配多个类型:

switch v := data.(type) {
case int, int32, int64:
    fmt.Printf("是整数类型:%v\n", v)
case string, []byte:
    fmt.Printf("是字符相关类型:%v\n", v)
}

记住:case 后面的类型声明始终是用来匹配 data 的类型,而不是 v 的值。这种类型匹配是 Go 语言提供的一种在运行时进行类型检查的机制。


http://www.kler.cn/a/377443.html

相关文章:

  • Pyraformer复现心得
  • 【Java Web】搭建Web环境以及初识JSP Tomcat
  • git 多账号配置
  • ffplay 实现视频流中音频的延迟
  • Qt 环境实现视频和音频播放
  • 408——计算机网络(持续更新)
  • Flarum:简洁而强大的开源论坛软件
  • 活动回顾丨艾体宝《开源软件供应链安全的最佳实践》线下研讨会圆满落幕!
  • 五、SpringBoot3实战(1)
  • docker对nginx.conf进行修改后页面无变化或页面报错
  • 【运动的&足球】足球场地区域图像分割系统源码&数据集全套:改进yolo11-RFAConv
  • 提高交换网络可靠性之端口安全配置
  • 项目自动化构建工具——make与Makefile详解
  • 高效实现SCRM用户管理的最佳实践与策略
  • DB-GPT系列(三):底层大模型设置(开源模型、在线模型)
  • 景联文科技医疗数据处理平台:强化医疗数据标注与管理,推动医疗数字化新篇章
  • Waymo的EMMA给多模态端到端自驾指引了方向
  • 软件(2)
  • Rust 力扣 - 73. 矩阵置零
  • gazebo仿真初学者可以试试这个ros小车
  • 我开源了一个短视频应用(Go+React)|DouTok2.0 项目介绍
  • Golang | Leetcode Golang题解之第528题按权重随机选择
  • springcloud整合sentinel,限流策略持久化到nacos,详细配置案例
  • RabbitMQ幂等性
  • vscode ssh连接autodl失败
  • Unity中的屏幕坐标系