Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenDocCN
build-web-application-with-golang
提交
cc7738fd
B
build-web-application-with-golang
项目概览
OpenDocCN
/
build-web-application-with-golang
通知
2
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
B
build-web-application-with-golang
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
cc7738fd
编写于
10月 16, 2012
作者:
W
Wenlei
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
updates images and some corresponing sentences.
上级
98eb9269
变更
5
隐藏空白更改
内联
并排
Showing
5 changed file
with
16 addition
and
2 deletion
+16
-2
2.5.md
2.5.md
+16
-2
images/2.4.student_struct.png
images/2.4.student_struct.png
+0
-0
images/2.5.rect_func_without_receiver.png
images/2.5.rect_func_without_receiver.png
+0
-0
images/2.5.shapes_func_with_receive_cp.png
images/2.5.shapes_func_with_receive_cp.png
+0
-0
images/2.5.shapes_func_without_receiver.png
images/2.5.shapes_func_without_receiver.png
+0
-0
未找到文件。
2.5.md
浏览文件 @
cc7738fd
...
...
@@ -26,9 +26,13 @@
这样实现有什么问题,当然没有问题咯,但是当你代码里面增加一个圆形、正方形、多边形等的时候,然后你又想计算他们的面积的时候怎么办啊?那就增加新的函数咯,但是函数名你就必须要跟着换了,你就要把函数名变成
`area_rectangle, area_circle, area_triangle...`
这样的实现不是最优雅的,而且从概念上来说一个形状的面积应该是属于它的一个特性,应该是属于这个形状的,就像他的字段一样
。
变成下图所表示的那样, 椭圆代表函数, 而这些函数并不从属于struct(或者以面向对象的术语来说,并不属于class),他们是单独存在于struct外围,而非在概念上属于某个struct的
。
基于上面的原因所以就有了
`method`
的概念,
`method`
是附属在一个给定的类型上的,他的语法和函数的申明语法几乎一样,除了在
`func`
后面跟一个receiver(也就是给定的类型)
![](
images/2.5.shapes_func_without_receive.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_receive_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
...
...
images/2.4.student_struct.png
查看替换文件 @
98eb9269
浏览文件 @
cc7738fd
79.2 KB
|
W:
|
H:
97.8 KB
|
W:
|
H:
2-up
Swipe
Onion skin
images/2.5.rect_func_without_receiver.png
0 → 100644
浏览文件 @
cc7738fd
19.3 KB
images/2.5.shapes_func_with_receive_cp.png
0 → 100644
浏览文件 @
cc7738fd
26.0 KB
images/2.5.shapes_func_without_receiver.png
0 → 100644
浏览文件 @
cc7738fd
67.0 KB
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录