zoukankan      html  css  js  c++  java
  • go的Type switch是一个switch语句么?

    相信这样的语句在go中大家见的很多

    switch t := arg.(type) {
    default:
        fmt.Printf("unexpected type %T
    ", t)     // %T prints whatever type t has
    case bool:
        fmt.Printf("boolean %t
    ", t)             // t has type bool
    case int:
        fmt.Printf("integer %d
    ", t)             // t has type int
    case *bool:
        fmt.Printf("pointer to boolean %t
    ", *t) // t has type *bool
    case *int:
        fmt.Printf("pointer to integer %d
    ", *t) // t has type *int
    }

    不过不知道有人细想过没有这样一个问题,

    t:=arg.(type) 

    在这个switch中 真的不是一个简简单单的变量t的声明以及赋值.

    首先, 不能把这句单独分离出去.

    也就是说,这样写是不对的.

    t:=arg.(type)
    switch t {
      ....  
    }

    这里的t:=必须和switch结合在一起.

    其次这个t到底是什么类型呢?

    按道理说在一个{}作用域中一个变量应该有一个确定的类型. 但是明显这里t要根据switch 匹配的值来确定类型的.

    第三, 这个switch能用fallthrough么?

    我们知道go语言有fallthrough关键字专门来处理模拟c语言中的switch的行为(不愧是c语言的设计者设计的).

    但是这里明显不能用fallthrough

    关于这个问题我第一次用的时候没觉得有什么问题,觉得很自然,直到看别人写的代码的时候突然意识到这个t居然如此强大,到底是一个类型呢还是一个变量?

    我想应该这么理解,这里的type switch不是普通的switch,就是go语言在语法层面为我们设计的类型转换的一种模式。

    不能不感叹go语言的编译器是有多智能啊!虽然看起来go的关键字很少,但是真是细究起来里面的魔鬼细节还是很多啊!

    以上只是我自己的一点学习感悟,与大家分享。

  • 相关阅读:
    Unity PhysicsScene测试
    游戏编程精粹学习
    Unity StreamingMipmaps 简单测试
    稀疏贴图 SparseTexture
    前端工程师是怎样一种职业
    web资源预加载-生产环境实践
    2019年终总结——三十而立
    一种前端灰度发布方案
    2018年终总结——越过山丘
    记录一个前端bug的解决过程
  • 原文地址:https://www.cnblogs.com/baizx/p/5036321.html
Copyright © 2011-2022 走看看