第7章,部分字词修订,语序调整。少量错误修订。

This commit is contained in:
zhliner
2017-08-24 22:29:24 +08:00
parent 9a9b9a0594
commit 17919273e1
14 changed files with 87 additions and 87 deletions

View File

@@ -11,9 +11,9 @@ f := w.(*os.File) // success: f == os.Stdout
c := w.(*bytes.Buffer) // panic: interface holds *os.File, not *bytes.Buffer
```
第二种如果相反断言的类型T是一个接口类型然后类型断言检查是否x的动态类型满足T。如果这个检查成功了动态值没有获取到这个结果仍然是一个有相同类型和值部分的接口值但是结果类型T。换句话说对一个接口类型的类型断言改变了类型的表述方式改变了可以获取的方法集合通常更大但是它保了接口值内部的动态类型和值的部分。
第二种,如果相反断言的类型T是一个接口类型然后类型断言检查是否x的动态类型满足T。如果这个检查成功了动态值没有获取到这个结果仍然是一个有相同动态类型和值部分的接口值,但是结果类型T。换句话说对一个接口类型的类型断言改变了类型的表述方式改变了可以获取的方法集合通常更大但是它保了接口值内部的动态类型和值的部分。
在下面的第一个类型断言后w和rw都持有os.Stdout因此它们每个有一个动态类型`*os.File`但是变量w是一个io.Writer类型只对外公开文件的Write方法而rw变量也只公开它的Read方法。
在下面的第一个类型断言后w和rw都持有os.Stdout因此它们有一个动态类型`*os.File`但是变量w是一个io.Writer类型只对外公开文件的Write方法而rw变量公开它的Read方法。
```go
var w io.Writer
@@ -23,14 +23,14 @@ w = new(ByteCounter)
rw = w.(io.ReadWriter) // panic: *ByteCounter has no Read method
```
如果断言操作的对象是一个nil接口值那么不论被断言的类型是什么这个类型断言都会失败。我们几乎不需要对一个更少限制性的接口类型更少的方法集合做断言因为它表现的就像赋值操作一样除了对于nil接口值的情况。
如果断言操作的对象是一个nil接口值那么不论被断言的类型是什么这个类型断言都会失败。我们几乎不需要对一个更少限制性的接口类型更少的方法集合做断言因为它表现的就像赋值操作一样除了对于nil接口值的情况。
```go
w = rw // io.ReadWriter is assignable to io.Writer
w = rw.(io.Writer) // fails only if rw == nil
```
经常地我们对一个接口值的动态类型是不确定的并且我们更愿意去检验它是否是一些特定的类型。如果类型断言出现在一个预期有两个结果的赋值操作中例如如下的定义这个操作不会在失败的时候发生panic但是替地返回一个额外的第二个结果,这个结果是一个标识成功的布尔值:
经常地对一个接口值的动态类型我们是不确定的并且我们更愿意去检验它是否是一些特定的类型。如果类型断言出现在一个预期有两个结果的赋值操作中例如如下的定义这个操作不会在失败的时候发生panic但是替地返回一个额外的第二个结果,这个结果是一个标识成功与否的布尔值:
```go
var w io.Writer = os.Stdout
@@ -38,7 +38,7 @@ f, ok := w.(*os.File) // success: ok, f == os.Stdout
b, ok := w.(*bytes.Buffer) // failure: !ok, b == nil
```
第二个结果常规地赋值给一个命名为ok的变量。如果这个操作失败了那么ok就是false值第一个结果等于被断言类型的零值在这个例子中就是一个nil的`*bytes.Buffer`类型。
第二个结果常赋值给一个命名为ok的变量。如果这个操作失败了那么ok就是false值第一个结果等于被断言类型的零值在这个例子中就是一个nil的`*bytes.Buffer`类型。
这个ok结果经常立即用于决定程序下面做什么。if语句的扩展格式让这个变的很简洁
@@ -48,7 +48,7 @@ if f, ok := w.(*os.File); ok {
}
```
当类型断言的操作对象是一个变量,你有时会看见原来的变量名重用而不是声明一个新的本地变量,这个重用的变量会覆盖原来的值,如下面这样:
当类型断言的操作对象是一个变量,你有时会看见原来的变量名重用而不是声明一个新的本地变量,这个重用的变量原来的值会被覆盖理解其实是声明了一个同名的新的本地变量外层原来的w不会被改变,如下面这样:
```go
if w, ok := w.(*os.File); ok {