首页 > 其他 > 详细

go的Type switch是一个switch语句么?

时间:2015-12-10 16:25:43      阅读:154      评论:0      收藏:0      [点我收藏+]

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

switch t := arg.(type) {
default:
    fmt.Printf("unexpected type %T\n", t)     // %T prints whatever type t has
case bool:
    fmt.Printf("boolean %t\n", t)             // t has type bool
case int:
    fmt.Printf("integer %d\n", t)             // t has type int
case *bool:
    fmt.Printf("pointer to boolean %t\n", *t) // t has type *bool
case *int:
    fmt.Printf("pointer to integer %d\n", *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的关键字很少,但是真是细究起来里面的魔鬼细节还是很多啊!

 

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

 

go的Type switch是一个switch语句么?

原文:http://www.cnblogs.com/baizx/p/5036321.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!