From 2a9a616c493a9286351693f5d33185f92730ab7d Mon Sep 17 00:00:00 2001 From: Unknwon Date: Thu, 10 Sep 2015 18:08:40 -0400 Subject: [PATCH] 11.3 --- README.md | 2 +- README_gc.md | 2 +- TOC.md | 4 +++- eBook/11.3.md | 8 +++----- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index a9edf1c..8e9d23c 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ ## 翻译进度 -11.1 [接口是什么](eBook/11.1.md) +11.3 [类型断言:如何检测和转换接口变量的类型](eBook/11.3.md) ## 支持本书 diff --git a/README_gc.md b/README_gc.md index 4d7d1f8..2118ea4 100644 --- a/README_gc.md +++ b/README_gc.md @@ -28,4 +28,4 @@ Golang 编程:245386165 |更新日期 |更新内容 |----------|------------------ -|2015-09-8|11.1 接口是什么 \ No newline at end of file +|2015-09-10|11.3 类型断言:如何检测和转换接口变量的类型 \ No newline at end of file diff --git a/TOC.md b/TOC.md index 0fcde11..f577b85 100644 --- a/TOC.md +++ b/TOC.md @@ -89,4 +89,6 @@ - 10.7 [类型的 String() 方法和格式化描述符](eBook/10.7.md) - 10.8 [垃圾回收和 SetFinalizer](eBook/10.8.md) - 第11章:[接口(interface)与反射(reflection)](eBook/11.0.md) - - 11.1 [接口是什么](eBook/11.1.md) \ No newline at end of file + - 11.1 [接口是什么](eBook/11.1.md) + - 11.2 [接口嵌套接口](eBook/11.2.md) + - 11.3 [类型断言:如何检测和转换接口变量的类型](eBook/11.3.md) \ No newline at end of file diff --git a/eBook/11.3.md b/eBook/11.3.md index 5a6602b..c3ffeb2 100644 --- a/eBook/11.3.md +++ b/eBook/11.3.md @@ -3,10 +3,10 @@ 一个接口类型的变量 `varI` 中可以包含任何类型的值,必须有一种方式来检测它的 **动态** 类型,即运行时在变量中存储的值的实际类型。在执行过程中动态类型可能会有所不同,但是它总是可以分配给接口变量本身的类型。通常我们可以使用 **类型断言** 来测试在某个时刻 `varI` 是否包含类型 `T` 的值: ```go - v := varI.(T) // unchecked type assertion +v := varI.(T) // unchecked type assertion ``` -**varI必须是一个接口变量**,否则编译器会报错:`invalid type assertion: varI.(T) (non-interface type (type of varI) on left)` 。 +**varI 必须是一个接口变量**,否则编译器会报错:`invalid type assertion: varI.(T) (non-interface type (type of varI) on left)` 。 类型断言可能是无效的,虽然编译器会尽力检查转换是否有效,但是它不可能预见所有的可能性。如果转换在程序运行时失败会导致错误发生。更安全的方式是使用以下形式来进行类型断言: @@ -18,7 +18,7 @@ if v, ok := varI.(T); ok { // checked type assertion // varI is not of type T ``` -如果转换合法,`v` 是 `varI` 转换到类型 `T`的值,`ok` 会是 `true`;否则 `v` 是类型 `T` 的零值,`ok` 是 `false`,也没有运行时错误发生。 +如果转换合法,`v` 是 `varI` 转换到类型 `T` 的值,`ok` 会是 `true`;否则 `v` 是类型 `T` 的零值,`ok` 是 `false`,也没有运行时错误发生。 **应该总是使用上面的方式来进行类型断言**。 @@ -30,8 +30,6 @@ if _, ok := varI.(T); ok { } ``` -TODO ??:In this form shadowing the variable varI by giving varI and v the same name is sometimes done. - 示例 11.4 type_interfaces.go ```go