码迷,mamicode.com
首页 > 编程语言 > 详细

GO语言的进阶之路-面向对象编程

时间:2017-07-09 10:48:19      阅读:385      评论:0      收藏:0      [点我收藏+]

标签:空间   比较   run   相同   分享   网页   运行   一句话   port   

                                                                  GO语言的进阶之路-面向对象编程

                                                作者:尹正杰

版权声明:原创作品,谢绝转载!否则将追究法律责任。

 

  当你看完这篇文章之时,我可以说你的Golang算是入门了,何为入门?就是你去看Docker 源码能看懂60%的语法结构,因为涉及一些unix的代码可能没有Linux运维基础的同学在学习的时候会很吃力,看起来也会带来一定的难度,如果有时间的话我会给大家解析Docker部门精辟的源码。好了,回归正题吧,我们今天要学习的内容是什么呢?即面向对象编程。当然,不要用屌丝的心态来说:“那要是没对象的还咋编程呢?”,哈哈~正杰要告诉你的是:“此对象非彼对象”,没有“对象”照样编程啊!那么问题来了,到底什么事面向对象编程呢?

 

一.什么是面向对象编程;

   在Golang的对象可以用一句话总结:“面向对象就是将要处理的数据跟函数进行绑定的方法”。

  如果你从来没有学过Python的话就是可以理解是class,如果在学习Golang之前从来没有接触过其他语言(比如说我)的话,那么你可以这样理解:“它是一种编程风格,就是把一切东西看成一个个对象,比如人,车,面包,等等,然后把这些对象拥有的属性变量,比如年龄,民族,工作地点,变质期,寿命,还有操作这些属性变量的函数打包成一个类来表示,这个类的一个抽象就是一个对象,比如人这个类包含一些属性,比如年龄,名字,住址等,他还有一些对别人告诉这些属性的功能,比如:说,看,走等!!”。这就是的面向对象的特点!!!

 

二.为什么要有面向对象编程;

  说到面向对象编程,就不得不说一下面向过程编程,我上次跟大家分享过面向过程编程的方法,也就是定义一些函数,减少了代码的重复性,增加了代码的扩展性和易读性等等。而且当大家“啪啪啪”代码敲的起劲的时候突然冒出个面向对象,对它的出现不免会有所疑惑,面向过程已经如此好了,干嘛还要面向对象呢?其实,我们举个例子来说明一下你就知道了。比如让你写一个人的模型,用函数写你要如果实现呢?比如现在要让你写关于:“刘德华,范冰冰,蔡依林”他们三个人的特点,没错,你可以面向过程式编程用函数将他们的特点定义 出来,那么问题来了,如果我想在外部调用“刘德华”或是“范冰冰”的特点该如果还实现呢?用函数可能非常难以实现。因为面向过程式编程虽然不印象实现的功能,但是其复杂度很低,所以,在实现一些功能上可能欠缺点火候。
  这个时候,面向对象就思想就出来啦,面向对象就可能很轻松的实现在外部调用“刘德华”或是“范冰冰”的特点。想要了解更多关于面向对象的发展是可以问我的大师兄“百度”,当然也可以问下我的二师兄“谷歌”,在这里不扯太多历史了,大家多去敲一些代码就会体现面向对象的好处,因为Go是一个完全面向对象的语言。例如,它允许基于我们定义的类型的方法,而没有像其他语言一样的装箱/拆箱操作。其实
接触面向对象编程起初大家都是拒绝的,都有抵触心理。但是时间一长你就知道哪个才是你想要的!就好像你整天和你的男性朋友玩的很愉快,突然有一天一个长得非常哇塞的小姐姐出现在你面前,你在你的男性朋友面向说着:“这女孩也就那样,长得还行吧”,然后备注兄弟私下找机会和这个妹子约会,吃饭,看电影是一个道理。

 

三.如果定义一个对象;

  当你看到这里的时候,恭喜你成功被洗脑了,如果你现在还有抵触心理学习面向对象编程的话,建议关闭该网页,因为内心的抵触你在学习这篇博客的内容会很吃力,可能看着看着你就不懂了,忘记之前的面向过程编程,让我们重新学习一种新的编程风格吧。当然,我们也可以对比一下两者的不同,这样学习起来也方便记忆。

  下面的案例是:在二维空间中,求两点之间的距离。

1.用函数实现求两点的距离;

 1 /*
 2 #!/usr/bin/env gorun
 3 @author :yinzhengjie
 4 Blog:http://www.cnblogs.com/yinzhengjie/tag/GO%E8%AF%AD%E8%A8%80%E7%9A%84%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
 5 EMAIL:y1053419035@qq.com
 6 */
 7 
 8 package main
 9 
10 import (
11     "math"
12     "fmt"
13 )
14 
15 type Point struct {
16     X,Y float64
17 }
18 
19 func Distence(p, q Point) float64 {
20     return math.Hypot(q.X-p.X,q.Y-p.Y)  //"Hypot"是计算两点之间点距离
21 }
22 
23 func main() {
24     p := Point{1,2}
25     q := Point{4,6}
26     fmt.Println(Distence(p,q)) //函数的调用方式,即传值的方式调用。
27 }
28 
29 
30 
31 #以上代码输出结果如下:
32 5

2.用对象实现求两点的距离;

 1 /*
 2 #!/usr/bin/env gorun
 3 @author :yinzhengjie
 4 Blog:http://www.cnblogs.com/yinzhengjie/tag/GO%E8%AF%AD%E8%A8%80%E7%9A%84%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
 5 EMAIL:y1053419035@qq.com
 6 */
 7 
 8 package main
 9 
10 import (
11     "math"
12     "fmt"
13 )
14 
15 type Point struct { //定义一个结构题体,你可以理解是是Python中的class
16     X,Y float64
17 }
18 
19 func (p Point)Distence(q Point) float64 { //给p对象定义一个Distence的方法,你可以理解绑定了一个Distence的方法。
20     return math.Hypot(q.X-p.X,q.Y-p.Y)
21 }
22 
23 func main() {
24     p := Point{1,2}
25     q := Point{4,6}
26     fmt.Println((p.Distence(q))) //类的调用方式,注意,如果定义就要如何调用!(这里是调用p的Distence方法。)
27 }
28 
29 
30 
31 #以上代码输出结果如下:
32 5

   当你看了这两段代码你现在可能会反问,实现的效果都是一样的啊,即他们的运行结果都相同,只是在定义和调用的方式不同而已。并不能明显体现出他们的差异性。也比较不出来他们的差别。我只是想说好戏还在后头,我们慢慢来体会它的奥妙之处,现在,我们就知道如何定义了一个对象了吧。那求多个点的长度又该如果定义呢?

3.小试牛刀;

 计算多个点的连线的总长度,实现代码如下:

 1 /*
 2 #!/usr/bin/env gorun
 3 @author :yinzhengjie
 4 Blog:http://www.cnblogs.com/yinzhengjie/tag/GO%E8%AF%AD%E8%A8%80%E7%9A%84%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
 5 EMAIL:y1053419035@qq.com
 6 */
 7 
 8 package main
 9 
10 import (
11     "math"
12     "fmt"
13 )
14 
15 type Point struct {
16     X,Y float64
17 }
18 
19 
20 func (p Point)Distence(q Point) float64 {
21     return math.Hypot(q.X-p.X,q.Y-p.Y)
22 }
23 
24 func Distence(path []Point) float64 { //定义一个path变了,path其是包含Point类型的数组切片, Slice可以理解为动态增长的数组.
25     var   s float64
26     for i := 0;i <len(path) - 1 ; i++ {
27         s += path[i].Distence(path[i+1])
28     }
29     return s
30 }
31 
32 func main() {
33     path := []Point{{10,20},{30,40},{50,60}}
34     fmt.Println(Distence(path))
35 }
36 
37 
38 
39 #以上代码输出结果如下:
40 56.568542494923804

 

四.

 

GO语言的进阶之路-面向对象编程

标签:空间   比较   run   相同   分享   网页   运行   一句话   port   

原文地址:http://www.cnblogs.com/yinzhengjie/p/7138769.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!