mirror of
https://github.com/unknwon/the-way-to-go_ZH_CN.git
synced 2025-08-12 03:55:28 +08:00
add ch10.6
This commit is contained in:
27
eBook/10.6.md
Normal file
27
eBook/10.6.md
Normal file
@@ -0,0 +1,27 @@
|
||||
# 10.6 方法
|
||||
|
||||
## 10.6.1 方法是什么
|
||||
|
||||
在Go中,结构体就像是类的一种简化形式,那么OO程序员可能会问:类的方法在哪里呢?在Go中有一个概念,它和方法有着同样的名字,并且大体上意思相同:Go方法是作用在接受者(receiver)上的一个函数,接受者是某种类型的变量。因此方法是一种特殊类型的函数。
|
||||
|
||||
接受者类型可以是(几乎)任何类型,不仅仅是结构体类型:任何类型都可以有方法,甚至可以是函数类型,可以是int、bool、string或数组的alias类型。但是接受者不能是一个接口类型(参考 第11章),因为接口是一个抽象定义,但是方法却是具体实现;如果这样做会引发一个编译错误:*invalid receiver type…*
|
||||
|
||||
最后接受者不能是一个指针类型,但是它可以是任何其他允许类型的指针。
|
||||
|
||||
一个类型加上它的方法等价于OO中的一个类。一个重要的区别是:在Go中,类型的代码和绑定在它上面的方法的代码可以不放置在一起,它们可以存在在不同的源文件,唯一的要求是:它们必须是同一个包的。
|
||||
|
||||
类型T(或*T)上的所有方法的集合叫做类型T(或*T)的方法集。
|
||||
|
||||
因为方法是函数,所以同样的,不允许方法重载,即对于一个类型只能有一个给定名称的方法。但是如果基于接受者类型,是有重载的:具有同样名字的方法可以在2个或多个不同的接受者类型上存在,比如在同一个包里这么做是允许的:
|
||||
|
||||
```go
|
||||
func (a *denseMatrix) Add(b Matrix) Matrix
|
||||
func (a *sparseMatrix) Add(b Matrix) Matrix
|
||||
```
|
||||
|
||||
|
||||
|
||||
## 链接
|
||||
- [目录](directory.md)
|
||||
- 上一节:[10.5 匿名字段和内嵌结构体](10.5.md)
|
||||
- 下一节:[10.7 TODO](10.7.md)
|
Reference in New Issue
Block a user