mirror of
https://github.com/unknwon/the-way-to-go_ZH_CN.git
synced 2025-08-12 00:11:36 +08:00
fix encoding
This commit is contained in:
@@ -1,8 +1,8 @@
|
||||
# 11.6 ʹ<EFBFBD>÷<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӿ<EFBFBD>
|
||||
# 11.6 使用方法集与接口
|
||||
|
||||
<EFBFBD><EFBFBD> 10.6.3 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> methodset1.go <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵķ<EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Dz<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD>뻹<EFBFBD><EFBFBD>ֵ<EFBFBD>ġ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е㸴<EFBFBD>ӣ<EFBFBD>ԭ<EFBFBD><EFBFBD><EFBFBD>ǽӿڱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>д洢<EFBFBD>ľ<EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD>Dz<EFBFBD><EFBFBD><EFBFBD>Ѱַ<EFBFBD>ģ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD>ǣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>ò<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ij<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
在 10.6.3 及例子 methodset1.go 中我们看到,作用于变量上的方法实际上是不区分变量到底是指针还是值的。当碰到接口类型值时,这会变得有点复杂,原因是接口变量中存储的具体值是不可寻址的,幸运的是,如果使用不当编译器会给出错误。考虑下面的程序:
|
||||
|
||||
ʾ<EFBFBD><EFBFBD> 11.5 methodset2.go:
|
||||
示例 11.5 methodset2.go:
|
||||
|
||||
```go
|
||||
package main
|
||||
@@ -60,34 +60,34 @@ func main() {
|
||||
}
|
||||
```
|
||||
|
||||
**<EFBFBD><EFBFBD><EFBFBD><EFBFBD>**
|
||||
**讨论**
|
||||
|
||||
<EFBFBD><EFBFBD> `lst` <EFBFBD>ϵ<EFBFBD><EFBFBD><EFBFBD> `CountInto` ʱ<EFBFBD>ᵼ<EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ `CountInto` <EFBFBD><EFBFBD>Ҫһ<EFBFBD><EFBFBD> `Appender`<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ķ<EFBFBD><EFBFBD><EFBFBD> `Append` ֻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD>ϡ<EFBFBD> <20><> `lst` <EFBFBD>ϵ<EFBFBD><EFBFBD><EFBFBD> `LongEnough` <EFBFBD>ǿ<EFBFBD><EFBFBD>Ե<EFBFBD><EFBFBD><EFBFBD>Ϊ 'Len' <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD>ϡ<EFBFBD>
|
||||
在 `lst` 上调用 `CountInto` 时会导致一个编译器错误,因为 `CountInto` 需要一个 `Appender`,而它的方法 `Append` 只定义在指针上。 在 `lst` 上调用 `LongEnough` 是可以的因为 'Len' 定义在值上。
|
||||
|
||||
<EFBFBD><EFBFBD> `plst` <EFBFBD>ϵ<EFBFBD><EFBFBD><EFBFBD> `CountInto` <EFBFBD>ǿ<EFBFBD><EFBFBD>Եģ<EFBFBD><EFBFBD><EFBFBD>Ϊ `CountInto` <EFBFBD><EFBFBD>Ҫһ<EFBFBD><EFBFBD> `Appender`<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ķ<EFBFBD><EFBFBD><EFBFBD> `Append` <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>ϡ<EFBFBD> <20><> `plst` <EFBFBD>ϵ<EFBFBD><EFBFBD><EFBFBD> `LongEnough` Ҳ<EFBFBD>ǿ<EFBFBD><EFBFBD>Եģ<EFBFBD><EFBFBD><EFBFBD>Ϊָ<EFBFBD><EFBFBD><EFBFBD>ᱻ<EFBFBD>Զ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>á<EFBFBD>
|
||||
在 `plst` 上调用 `CountInto` 是可以的,因为 `CountInto` 需要一个 `Appender`,并且它的方法 `Append` 定义在指针上。 在 `plst` 上调用 `LongEnough` 也是可以的,因为指针会被自动解引用。
|
||||
|
||||
**<EFBFBD>ܽ<EFBFBD>**
|
||||
**总结**
|
||||
|
||||
<EFBFBD>ڽӿ<EFBFBD><EFBFBD>ϵ<EFBFBD><EFBFBD>÷<EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>кͷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>ͬ<EFBFBD>Ľ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǿ<EFBFBD><EFBFBD>ԴӾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> `P` ֱ<>ӿ<EFBFBD><D3BF>Ա<EFBFBD>ʶ<EFBFBD>ģ<EFBFBD>
|
||||
在接口上调用方法时,必须有和方法定义时相同的接收者类型或者是可以从具体类型 `P` 直接可以辨识的:
|
||||
|
||||
- ָ<EFBFBD>뷽<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
- ֵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
- <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD>ķ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ã<EFBFBD><EFBFBD><EFBFBD>Ϊָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
- <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD>ķ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD><EFBFBD>ã<EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD>洢<EFBFBD>ڽӿ<EFBFBD><EFBFBD>е<EFBFBD>ֵû<EFBFBD>е<EFBFBD>ַ
|
||||
- 指针方法可以通过指针调用
|
||||
- 值方法可以通过值调用
|
||||
- 接收者是值的方法可以通过指针调用,因为指针会首先被解引用
|
||||
- 接收者是指针的方法不可以通过值调用,因为存储在接口中的值没有地址
|
||||
|
||||
<EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD>ӿڸ<EFBFBD>ֵʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>п<EFBFBD><EFBFBD>ܵĽӿڷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>ֵ<EFBFBD>ϱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ã<EFBFBD><EFBFBD><EFBFBD><EFBFBD>˲<EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD>ĸ<EFBFBD>ֵ<EFBFBD>ڱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ھͻ<EFBFBD>ʧ<EFBFBD>ܡ<EFBFBD>
|
||||
将一个值赋值给一个接口赋值时,编译器会确保所有可能的接口方法都可以在此值上被调用,因此不正确的赋值在编译期就会失败。
|
||||
|
||||
|
||||
**<EFBFBD><EFBFBD>ע**
|
||||
**译注**
|
||||
|
||||
Go<EFBFBD><EFBFBD><EFBFBD>Թ淶<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˽ӿڷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD><EFBFBD>ù<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
Go语言规范定义了接口方法集的调用规则:
|
||||
|
||||
- <EFBFBD><EFBFBD><EFBFBD><EFBFBD> *T <20>Ŀɵ<C4BF><C9B5>÷<EFBFBD><C3B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ *T <EFBFBD><EFBFBD> T <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>з<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
- <EFBFBD><EFBFBD><EFBFBD><EFBFBD> T <20>Ŀɵ<C4BF><C9B5>÷<EFBFBD><C3B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ T <20><><EFBFBD><EFBFBD><EFBFBD>з<EFBFBD><D0B7><EFBFBD>
|
||||
- <EFBFBD><EFBFBD><EFBFBD><EFBFBD> T <20>Ŀɵ<C4BF><C9B5>÷<EFBFBD><C3B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ *T <20>ķ<EFBFBD><C4B7><EFBFBD>
|
||||
- 类型 *T 的可调用方法集包含接受者为 *T 或 T 的所有方法集
|
||||
- 类型 T 的可调用方法集包含接受者为 T 的所有方法
|
||||
- 类型 T 的可调用方法集不包含接受者为 *T 的方法
|
||||
|
||||
## <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
## 链接
|
||||
|
||||
- [Ŀ¼](directory.md)
|
||||
- <EFBFBD><EFBFBD>һ<EFBFBD>ڣ<EFBFBD>[<EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>ֵ<EFBFBD>Ƿ<EFBFBD>ʵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ij<EFBFBD><EFBFBD><EFBFBD>ӿ<EFBFBD>](11.5.md)
|
||||
- <EFBFBD><EFBFBD>һ<EFBFBD>ڣ<EFBFBD>[<EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӣ<EFBFBD>ʹ<EFBFBD><EFBFBD>Sorter<EFBFBD>ӿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>](11.7.md)
|
||||
- [目录](directory.md)
|
||||
- 上一节:[测试一个值是否实现了某个接口](11.5.md)
|
||||
- 下一节:[第一个例子:使用Sorter接口排序](11.7.md)
|
Reference in New Issue
Block a user