fix escape

This commit is contained in:
Xargin 2016-10-18 13:03:18 +08:00
parent e0e57d30b4
commit cd0f3ff29c

View File

@ -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{}值持有一个booleanfloatstringmappointer或者任意其它的类型我们当然不能直接对它持有的值做操作因为interface{}没有任何方法。我们会在7.10章中学到一种用类型断言来获取interface{}中值的方法。 对于创建的一个interface{}值持有一个booleanfloatstringmappointer或者任意其它的类型我们当然不能直接对它持有的值做操作因为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