回到简体

This commit is contained in:
chai2010
2016-02-15 11:06:34 +08:00
parent 9e878f9944
commit 2b37b23285
177 changed files with 2354 additions and 2354 deletions

View File

@@ -1,8 +1,8 @@
## 7.10. 類型斷
## 7.10. 类型断
類型斷言是一使用在接口值上的操作。法上它看起像x.(T)被稱爲斷言類型,里x表示一接口的型和T表示一個類型。一個類型斷言檢査它操作象的動態類型是否和言的型匹配。
类型断言是一使用在接口值上的操作。法上它看起像x.(T)被称为断言类型,里x表示一接口的型和T表示一个类型。一个类型断言检查它操作象的动态类型是否和言的型匹配。
里有兩種可能。第一,如果言的型T是一個具體類型然後類型斷言檢査x的動態類型是否和T相同。如果這個檢査成功了,類型斷言的果是x的動態值,然它的型是T。換句話説,具體類型的類型斷言從它的操作象中得具的值。如果檢査失敗,接下來這個操作會拋出panic。例如
里有两种可能。第一,如果言的型T是一个具体类型然后类型断言检查x的动态类型是否和T相同。如果这个检查成功了,类型断言的果是x的动态值,然它的型是T。换句话说,具体类型的类型断言从它的操作象中得具的值。如果检查失败,接下来这个操作会抛出panic。例如
```go
var w io.Writer
@@ -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,9 +38,9 @@ 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句的展格式讓這個變的很簡潔
这个ok结果经常立即用于决定程序下面做什。if句的展格式让这个变的很简洁
```go
if f, ok := w.(*os.File); ok {
@@ -48,7 +48,7 @@ if f, ok := w.(*os.File); ok {
}
```
當類型斷言的操作象是一個變量,你有時會看見原來的變量名重用而不是明一新的本地量,這個重用的變量會覆蓋原來的值,如下面這樣
当类型断言的操作象是一个变量,你有时会看见原来的变量名重用而不是明一新的本地量,这个重用的变量会覆盖原来的值,如下面这样
```go
if w, ok := w.(*os.File); ok {