回到简体

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.5.1. 警告:一包含nil指的接口不是nil接口
### 7.5.1. 警告:一包含nil指的接口不是nil接口
不包含任何值的nil接口值和一個剛好包含nil指的接口值是不同的。這個細微區别産生了一容易倒每Go程序的陷阱。
不包含任何值的nil接口值和一个刚好包含nil指的接口值是不同的。这个细微区别产生了一容易倒每Go程序的陷阱。
思考下面的程序。debug變量設置爲truemain函數會將f函數的輸出收集到一bytes.Buffer型中。
思考下面的程序。debug变量设置为truemain函数会将f函数的输出收集到一bytes.Buffer型中。
```go
const debug = true
@@ -27,7 +27,7 @@ func f(out io.Writer) {
}
```
可能會預計當把變量debug設置爲false可以禁止對輸出的收集,但是實際上在out.Write方法調用時程序生了panic
可能会预计当把变量debug设置为false可以禁止对输出的收集,但是实际上在out.Write方法调用时程序生了panic
```go
if out != nil {
@@ -35,13 +35,13 @@ if out != nil {
}
```
main函數調用函數f時,它f函的out參數賦了一\*bytes.Buffer的空指所以out的動態值是nil。然而它的動態類型是\*bytes.Buffer意思就是out量是一包含空指值的非空接口(如7.5),所以防禦性檢査out!=nil的果依然是true。
main函数调用函数f时,它f函的out参数赋了一\*bytes.Buffer的空指所以out的动态值是nil。然而它的动态类型是\*bytes.Buffer意思就是out量是一包含空指值的非空接口(如7.5),所以防御性检查out!=nil的果依然是true。
![](../images/ch7-05.png)
動態分配機製依然定(\*bytes.Buffer).Write的方法會被調用,但是次的接收者的值是nil。對於一些如\*os.File的nil是一有效的接收者(§6.2.1),但是\*bytes.Buffer型不在這些類型中。這個方法會被調用,但是當它嚐試去獲取緩衝區時會發生panic。
动态分配机制依然定(\*bytes.Buffer).Write的方法会被调用,但是次的接收者的值是nil。对于一些如\*os.File的nil是一有效的接收者(§6.2.1),但是\*bytes.Buffer型不在这些类型中。这个方法会被调用,但是当它尝试去获取缓冲区时会发生panic。
問題在於盡管一nil的\*bytes.Buffer指針有實現這個接口的方法,它也不滿足這個接口具的行上的要求。特别是這個調用違反了(\*bytes.Buffer).Write方法的接收者非空的含先覺條件,所以nil指針賦給這個接口是錯誤的。解方案就是main函中的量buf的型改io.Writer因此可以避免一始就將一個不完全的值賦值給這個接口:
问题在于尽管一nil的\*bytes.Buffer指针有实现这个接口的方法,它也不满足这个接口具的行上的要求。特别是这个调用违反了(\*bytes.Buffer).Write方法的接收者非空的含先觉条件,所以nil指针赋给这个接口是错误的。解方案就是main函中的量buf的型改io.Writer因此可以避免一始就将一个不完全的值赋值给这个接口:
```go
var buf io.Writer
@@ -51,4 +51,4 @@ if debug {
f(buf) // OK
```
在我們已經把接口值的技巧都完了,讓我們來看更多的一些在Go標準庫中的重要接口型。在下面的三章中,我們會看到接口型是怎用在排序web服務,錯誤處理中的。
在我们已经把接口值的技巧都完了,让我们来看更多的一些在Go标准库中的重要接口型。在下面的三章中,我们会看到接口型是怎用在排序web服务,错误处理中的。