mirror of
https://github.com/gopl-zh/gopl-zh.github.com.git
synced 2025-08-05 07:11:52 +00:00
change escape of ch7
This commit is contained in:
@@ -13,7 +13,7 @@ c := w.(*bytes.Buffer) // panic: interface holds *os.File, not *bytes.Buffer
|
||||
|
||||
第二种,如果相反断言的类型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
|
||||
@@ -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语句的扩展格式让这个变的很简洁:
|
||||
|
||||
|
Reference in New Issue
Block a user