diff --git a/eBook/10.6.md b/eBook/10.6.md new file mode 100644 index 0000000..f28dfd0 --- /dev/null +++ b/eBook/10.6.md @@ -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)