Merge pull request #76 from wenlei/master

增加了2.5的关于method的两张图片,以及2.4关于type的封装表示,以及一些相关语句。
This commit is contained in:
astaxie
2012-10-15 18:10:30 -07:00
5 changed files with 16 additions and 2 deletions

18
2.5.md
View File

@@ -26,9 +26,13 @@
这样实现有什么问题,当然没有问题咯,但是当你代码里面增加一个圆形、正方形、多边形等的时候,然后你又想计算他们的面积的时候怎么办啊?那就增加新的函数咯,但是函数名你就必须要跟着换了,你就要把函数名变成`area_rectangle, area_circle, area_triangle...`
这样的实现不是最优雅的,而且从概念上来说一个形状的面积应该是属于它的一个特性,应该是属于这个形状的,就像他的字段一样
变成下图所表示的那样, 椭圆代表函数, 而这些函数并不从属于struct(或者以面向对象的术语来说并不属于class)他们是单独存在于struct外围而非在概念上属于某个struct的
基于上面的原因所以就有了`method`的概念,`method`是附属在一个给定的类型上的,他的语法和函数的申明语法几乎一样,除了在`func`后面跟一个receiver(也就是给定的类型)
![](images/2.5.rect_func_without_receiver.png?raw=true)
很显然,这样的实现并不优雅,而且从概念上来说一个"形状"的面积应该是"形状"的一个特性,应该是属于这个形状的,就像他的字段一样。
基于上面的原因所以就有了`method`的概念,`method`是附属在一个给定的类型上的,他的语法和函数的声明语法几乎一样,只是在`func`后面增加了一个receiver(也就是method所依从的主体)用上面提到的形状的例子来说method `area()` 是依赖于某个形状(比如说Rectangle)来发生作用的。Rectangle.area()的发出者应该是Rectangle area()是属于Rectangle而非一个外围函数。更具体地说Rectangle存在字段length 和 width,同时存在方法area(), 这些字段和方法都属于Rectangle。
用Rob Pike的话来说就是
@@ -75,12 +79,22 @@ method的语法如下
fmt.Println("Area of c2 is: ", c2.area())
}
在使用method的时候重要注意几点
- 虽然method的名字一模一样但是如果接收者不一样那么method就不一样
- method里面可以访问接收者的字段
- 调用method通过`.`访问就像struct里面访问字段一样
图示如下:
![](images/2.5.shapes_func_with_receiver_cp.png?raw=true)
在上例method area() 分别属于Rectangle和Circle 于是他们的 Receiver 就变成了Rectangle 和 Circle, 意思是这个area()方法 是由 Rectangle/Circle 发出的。
>值得说明的一点是图示中method用虚线标出意思是此处方法的Receiver是以值传递而非引用传递是的Receiver还可以是指针, 两者的差别在于, 指针作为Receiver会对实例对象的内容发生操作,而普通类型作为Receiver仅仅是以副本作为操作对象,并不对实例对象发生操作。后文对此会有详细论述。
那是不是method只能作用在struct上面呢当然不是咯他可以定义在任何你自定义的类型、内置类型、struct等各种类型上面。这里你是不是有点迷糊了什么叫自定义类型自定义类型不就是struct嘛不是这样的哦struct只是自定义类型里面一种比较特殊的类型而已还有其他自定义类型申明可以通过如下这样的申明来实现。
type typeName typeLiteral

Binary file not shown.

Before

Width:  |  Height:  |  Size: 79 KiB

After

Width:  |  Height:  |  Size: 98 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 67 KiB