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

简介: 相信这样的语句在go中大家见的很多 switch t := arg.(type) { default: fmt.Printf("unexpected type %T\n", t) // %T prints whatever type t has case bool: fmt.

相信这样的语句在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的关键字很少,但是真是细究起来里面的魔鬼细节还是很多啊!

 

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

 

目录
相关文章
|
3月前
|
Java Go
go语言在 switch 语句中使用 break
go语言在 switch 语句中使用 break
107 5
|
3月前
|
Java Go
go语言中switch 语句
go语言中switch 语句
41 5
|
5月前
|
Go 索引
internal\model\data_support.go:17:10: cannot use _ as value or type
internal\model\data_support.go:17:10: cannot use _ as value or type
|
6月前
|
存储 人工智能 Go
Go type assertions
Go type assertions
44 3
|
9月前
|
Go 开发者
Golang深入浅出之-Go语言流程控制:if、switch、for循环详解
【4月更文挑战第21天】本文介绍了Go语言中的流程控制语句,包括`if`、`switch`和`for`循环。`if`语句支持简洁的语法和初始化语句,但需注意比较运算符的使用。`switch`语句提供多分支匹配,可省略`break`,同时支持不带表达式的形式。`for`循环有多种形式,如基本循环和`for-range`遍历,遍历时修改原集合可能导致未定义行为。理解并避免易错点能提高代码质量和稳定性。通过实践代码示例,可以更好地掌握Go语言的流程控制。
66 3
Golang深入浅出之-Go语言流程控制:if、switch、for循环详解
|
9月前
|
JavaScript 前端开发 Java
Go 语言中的 Switch 语句详解
使用switch语句来选择要执行的多个代码块中的一个。 在Go中的switch语句类似于C、C++、Java、JavaScript和PHP中的switch语句。不同之处在于它只执行匹配的case,因此不需要使用break语句。
139 1
../../..xxx.go:46:18: aa.Bbb undefined (type *"xx/xxx/xx".Ccc has no field or method Bbb)
../../..xxx.go:46:18: aa.Bbb undefined (type *"xx/xxx/xx".Ccc has no field or method Bbb)
|
9月前
|
存储 编译器 Go
go语言第一章(变量,if, switch)
go语言第一章(变量,if, switch)
51 0
|
Go
5分钟看懂Go语言switch用法及应用场景
5分钟看懂Go语言switch用法及应用场景
213 0
|
Go
Go语言type关键字终于被玩明白了 类型别名的秘密都在这里
Go语言type关键字终于被玩明白了 类型别名的秘密都在这里
275 0

热门文章

最新文章