mirror of
https://github.com/gopl-zh/gopl-zh.github.com.git
synced 2024-12-25 14:28:58 +00:00
fix escape
This commit is contained in:
parent
e0e57d30b4
commit
cd0f3ff29c
@ -24,7 +24,7 @@ rwc = w // compile error: io.Writer lacks Close method
|
|||||||
|
|
||||||
因为ReadWriter和ReadWriteCloser包含所有Writer的方法,所以任何实现了ReadWriter和ReadWriteCloser的类型必定也实现了Writer接口
|
因为ReadWriter和ReadWriteCloser包含所有Writer的方法,所以任何实现了ReadWriter和ReadWriteCloser的类型必定也实现了Writer接口
|
||||||
|
|
||||||
在进一步学习前,必须先解释表示一个类型持有一个方法当中的细节。回想在6.2章中,对于每一个命名过的具体类型T;它一些方法的接收者是类型T本身然而另一些则是一个*T的指针。还记得在T类型的参数上调用一个*T的方法是合法的,只要这个参数是一个变量;编译器隐式的获取了它的地址。但这仅仅是一个语法糖:T类型的值不拥有所有*T指针的方法,那这样它就可能只实现更少的接口。
|
在进一步学习前,必须先解释表示一个类型持有一个方法当中的细节。回想在6.2章中,对于每一个命名过的具体类型T;它一些方法的接收者是类型T本身然而另一些则是一个`*T`的指针。还记得在T类型的参数上调用一个`*T`的方法是合法的,只要这个参数是一个变量;编译器隐式的获取了它的地址。但这仅仅是一个语法糖:T类型的值不拥有所有`*T`指针的方法,那这样它就可能只实现更少的接口。
|
||||||
|
|
||||||
举个例子可能会更清晰一点。在第6.5章中,IntSet类型的String方法的接收者是一个指针类型,所以我们不能在一个不能寻址的IntSet值上调用这个方法:
|
举个例子可能会更清晰一点。在第6.5章中,IntSet类型的String方法的接收者是一个指针类型,所以我们不能在一个不能寻址的IntSet值上调用这个方法:
|
||||||
|
|
||||||
@ -41,7 +41,7 @@ var s IntSet
|
|||||||
var _ = s.String() // OK: s is a variable and &s has a String method
|
var _ = s.String() // OK: s is a variable and &s has a String method
|
||||||
```
|
```
|
||||||
|
|
||||||
然而,由于只有*IntSet类型有String方法,所有也只有*IntSet类型实现了fmt.Stringer接口:
|
然而,由于只有`*IntSet`类型有String方法,所有也只有`*IntSet`类型实现了fmt.Stringer接口:
|
||||||
|
|
||||||
```go
|
```go
|
||||||
var _ fmt.Stringer = &s // OK
|
var _ fmt.Stringer = &s // OK
|
||||||
@ -79,14 +79,14 @@ any = new(bytes.Buffer)
|
|||||||
|
|
||||||
对于创建的一个interface{}值持有一个boolean,float,string,map,pointer,或者任意其它的类型;我们当然不能直接对它持有的值做操作,因为interface{}没有任何方法。我们会在7.10章中学到一种用类型断言来获取interface{}中值的方法。
|
对于创建的一个interface{}值持有一个boolean,float,string,map,pointer,或者任意其它的类型;我们当然不能直接对它持有的值做操作,因为interface{}没有任何方法。我们会在7.10章中学到一种用类型断言来获取interface{}中值的方法。
|
||||||
|
|
||||||
因为接口实现只依赖于判断的两个类型的方法,所以没有必要定义一个具体类型和它实现的接口之间的关系。也就是说,尝试文档化和断言这种关系几乎没有用,所以并没有通过程序强制定义。下面的定义在编译期断言一个*bytes.Buffer的值实现了io.Writer接口类型:
|
因为接口实现只依赖于判断的两个类型的方法,所以没有必要定义一个具体类型和它实现的接口之间的关系。也就是说,尝试文档化和断言这种关系几乎没有用,所以并没有通过程序强制定义。下面的定义在编译期断言一个`*bytes.Buffer`的值实现了io.Writer接口类型:
|
||||||
|
|
||||||
```go
|
```go
|
||||||
// *bytes.Buffer must satisfy io.Writer
|
// *bytes.Buffer must satisfy io.Writer
|
||||||
var w io.Writer = new(bytes.Buffer)
|
var w io.Writer = new(bytes.Buffer)
|
||||||
```
|
```
|
||||||
|
|
||||||
因为任意*bytes.Buffer的值,甚至包括nil通过(*bytes.Buffer)(nil)进行显示的转换都实现了这个接口,所以我们不必分配一个新的变量。并且因为我们绝不会引用变量w,我们可以使用空标识符来来进行代替。总的看,这些变化可以让我们得到一个更朴素的版本:
|
因为任意`*bytes.Buffer`的值,甚至包括nil通过`(*bytes.Buffer)(nil)`进行显示的转换都实现了这个接口,所以我们不必分配一个新的变量。并且因为我们绝不会引用变量w,我们可以使用空标识符来来进行代替。总的看,这些变化可以让我们得到一个更朴素的版本:
|
||||||
|
|
||||||
```go
|
```go
|
||||||
// *bytes.Buffer must satisfy io.Writer
|
// *bytes.Buffer must satisfy io.Writer
|
||||||
|
Loading…
Reference in New Issue
Block a user