leisore преди 10 години
родител
ревизия
fcd30058a8
променени са 1 файла, в които са добавени 27 реда и са изтрити 0 реда
  1. 27 0
      eBook/10.6.md

+ 27 - 0
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)