This commit is contained in:
Unknwon
2015-09-11 17:20:28 -04:00
parent bd24f7a94e
commit 4e7e7c93e2
4 changed files with 27 additions and 27 deletions

View File

@@ -9,7 +9,7 @@
## 翻译进度 ## 翻译进度
11.3 [类型断言:如何检测和转换接口变量的类型](eBook/11.3.md) 11.4 [类型判断type-switch](eBook/11.4.md)
## 支持本书 ## 支持本书

View File

@@ -28,4 +28,4 @@ Golang 编程245386165
|更新日期 |更新内容 |更新日期 |更新内容
|----------|------------------ |----------|------------------
|2015-09-10|11.3 类型断言:如何检测和转换接口变量的类型 |2015-09-11|11.4 类型判断type-switch

3
TOC.md
View File

@@ -91,4 +91,5 @@
- 第11章[接口interface与反射reflection](eBook/11.0.md) - 第11章[接口interface与反射reflection](eBook/11.0.md)
- 11.1 [接口是什么](eBook/11.1.md) - 11.1 [接口是什么](eBook/11.1.md)
- 11.2 [接口嵌套接口](eBook/11.2.md) - 11.2 [接口嵌套接口](eBook/11.2.md)
- 11.3 [类型断言:如何检测和转换接口变量的类型](eBook/11.3.md) - 11.3 [类型断言:如何检测和转换接口变量的类型](eBook/11.3.md)
- 11.4 [类型判断type-switch](eBook/11.4.md)

View File

@@ -1,46 +1,45 @@
# 11.4 类型判断type-switch # 11.4 类型判断type-switch
接口变量的类型也可以使用一种特殊形式的 `swtich` 来检测:**type-swtich** (下面是 示例 11.4 的第二部分): 接口变量的类型也可以使用一种特殊形式的 `swtich` 来检测:**type-swtich** (下面是示例 11.4 的第二部分):
```go ```go
switch t := areaIntf.(type) { switch t := areaIntf.(type) {
case *Square: case *Square:
fmt.Printf("Type Square %T with value %v\n", t, t) fmt.Printf("Type Square %T with value %v\n", t, t)
case *Circle: case *Circle:
fmt.Printf("Type Circle %T with value %v\n", t, t) fmt.Printf("Type Circle %T with value %v\n", t, t)
case nil: case nil:
fmt.Printf("nil value: nothing to check?\n") fmt.Printf("nil value: nothing to check?\n")
default: default:
fmt.Printf("Unexpected type %T\n", t) fmt.Printf("Unexpected type %T\n", t)
} }
``` ```
输出: 输出:
Type Square *main.Square with value &{5} Type Square *main.Square with value &{5}
变量 `t` 得到了 `areaIntf` 的值和类型, 所有 `case` 语句中列举的类型(`nil` 除外)都必须实现对应的接口(在上例中即 `Shaper`),如果被检测类型没有在 `case` 语句列举的类型中,就会执行`default` 语句。 变量 `t` 得到了 `areaIntf` 的值和类型, 所有 `case` 语句中列举的类型(`nil` 除外)都必须实现对应的接口(在上例中即 `Shaper`),如果被检测类型没有在 `case` 语句列举的类型中,就会执行 `default` 语句。
可以用 `type-switch` 进行运行时类型分析,但是在 `type-switch` 不允许有 `fallthrough` 可以用 `type-switch` 进行运行时类型分析,但是在 `type-switch` 不允许有 `fallthrough`
如果仅仅是测试变量的类型,不用它的值,那么就可以不需要赋值语句,比如: 如果仅仅是测试变量的类型,不用它的值,那么就可以不需要赋值语句,比如:
```go ```go
switch areaIntf.(type) { switch areaIntf.(type) {
case *Square: case *Square:
// TODO // TODO
case *Circle: case *Circle:
// TODO // TODO
... ...
default: default:
// TODO // TODO
} }
``` ```
下面的代码片段展示了一个类型分类函数,它有一个可变长度参数,可以是任意类型的数组,它会根据数组元素的实际类型执行不同的动作: 下面的代码片段展示了一个类型分类函数,它有一个可变长度参数,可以是任意类型的数组,它会根据数组元素的实际类型执行不同的动作:
```go ```go
func classifier(items ...interface{}) { func classifier(items ...interface{}) {
for i, x := range items { for i, x := range items {
switch x.(type) { switch x.(type) {
@@ -65,11 +64,11 @@ func classifier(items ...interface{}) {
在处理来自于外部的、类型未知的数据时,比如解析诸如 JSON 或 XML 编码的数据,类型测试和转换会非常有用。 在处理来自于外部的、类型未知的数据时,比如解析诸如 JSON 或 XML 编码的数据,类型测试和转换会非常有用。
示例12.17(xml.go) 中解析 XML 文档,我们就会用到 `type-switch` 在示例 12.17xml.go中解析 XML 文档,我们就会用到 `type-switch`
**练习 11.4** simple_interface2.go **练习 11.4** simple_interface2.go
接着 练习11.1 中的内容,创建第二个类型 `RSimple`,它也实现了接口 `Simpler`,写一个函数 `fi`,它可以区分 `Simple``RSimple` 类型的变量。 接着练习 11.1 中的内容,创建第二个类型 `RSimple`,它也实现了接口 `Simpler`,写一个函数 `fi`使它可以区分 `Simple``RSimple` 类型的变量。
## 链接 ## 链接