第7章,部分字词修订,语序调整。少量错误修订。

This commit is contained in:
zhliner
2017-08-24 22:29:24 +08:00
parent 9a9b9a0594
commit 17919273e1
14 changed files with 87 additions and 87 deletions

View File

@@ -44,9 +44,9 @@ func writeHeader(w io.Writer, contentType string) error {
}
```
为了避免重复定义我们将这个检查移入到一个实用工具函数writeString中但是它太有用了以致标准库将它作为io.WriteString函数提供。这是向一个io.Writer接口写入字符串的推荐方法。
为了避免重复定义我们将这个检查移入到一个实用工具函数writeString中但是它太有用了以致标准库将它作为io.WriteString函数提供。这是向一个io.Writer接口写入字符串的推荐方法。
这个例子的神奇之处在于没有定义了WriteString方法的标准接口没有指定它是一个需行为的标准接口。而且一个具体类型只会通过它的方法决定它是否满足stringWriter接口而不是任何它和这个接口类型表明的关系。它的意思就是上面的技术依赖于一个假设这个假设就是如果一个类型满足下面的这个接口然后WriteString(s)方法必须和Write([]byte(s))有相同的效果。
这个例子的神奇之处在于没有定义了WriteString方法的标准接口,也没有指定它是一个需行为的标准接口。一个具体类型只会通过它的方法决定它是否满足stringWriter接口而不是任何它和这个接口类型所表达的关系。它的意思就是上面的技术依赖于一个假设这个假设就是如果一个类型满足下面的这个接口然后WriteString(s)方法必须和Write([]byte(s))有相同的效果。
```go
interface {
@@ -55,9 +55,9 @@ interface {
}
```
尽管io.WriteString记录了它的假设,但是调用它的函数极少可能会去记录它们也做了同样的假设。定义一个特定类型的方法隐式地获取了对特定行为的协约。对于Go语言的新手特别是那些来自有强类型语言使用背景的新手可能会发现它缺乏显式的意图令人感到混乱但是在实战的过程中这几乎不是一个问题。除了空接口interface{},接口类型很少意外巧合地被实现。
尽管io.WriteString实施了这个假设,但是调用它的函数极少可能会去实施类似的假设。定义一个特定类型的方法隐式地获取了对特定行为的协约。对于Go语言的新手特别是那些来自有强类型语言使用背景的新手可能会发现它缺乏显式的意图令人感到混乱但是在实战的过程中这几乎不是一个问题。除了空接口interface{}接口类型很少意外巧合地被实现。
上面的writeString函数使用一个类型断言来知一个普遍接口类型的值是否满足一个更加具体的接口类型;并且如果满足,它会使用这个更具体接口的行为。这个技术可以被很好的使用不论这个被询问的接口是一个标准如io.ReadWriter或者用户定义的如stringWriter。
上面的writeString函数使用一个类型断言来知一个普遍接口类型的值是否满足一个更加具体的接口类型;并且如果满足,它会使用这个更具体接口的行为。这个技术可以被很好的使用不论这个被询问的接口是一个标准如io.ReadWriter或者用户定义的如stringWriter接口
这也是fmt.Fprintf函数怎么从其它所有值中区分满足error或者fmt.Stringer接口的值。在fmt.Fprintf内部有一个将单个操作对象转换成一个字符串的步骤像下面这样
@@ -75,6 +75,6 @@ func formatOneValue(x interface{}) string {
}
```
如果x满足这两个接口类型中的一个具体满足的接口决定对值的格式化方式。如果都不满足默认的case或多或少会统一地使用反射来处理所有的其它类型我们可以在第12章知道具体是怎么实现的。
如果x满足这两个接口类型中的一个具体满足的接口决定对值的格式化方式。如果都不满足默认的case或多或少会统一地使用反射来处理所有的其它类型我们可以在第12章知道具体是怎么实现的。
再一次的它假设任何有String方法的类型满足fmt.Stringer中约定的行为这个行为会返回一个适合打印的字符串。
再一次的它假设任何有String方法的类型满足fmt.Stringer中约定的行为这个行为会返回一个适合打印的字符串。