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

    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:[email protected]
 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:[email protected]
 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:[email protected]
 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

四.

时间: 2024-08-05 14:23:37

GO语言的进阶之路-面向对象编程的相关文章

GO语言的进阶之路-go的程序结构以及包简介

GO语言的进阶之路-go的程序结构以及包简介 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.编辑,编译和运行 A,编辑 Go程序使用UTF-8编码的纯Unicode文本编写.大部分现代编译器都能够自动处理编码,并且某些最流行的编辑器还支持Go语言的语法高亮和自动缩进.如果你用的编辑器不支持Go语言,可以在Go语言官网的搜索框中输入编辑器的名字,看看是否有适合的插件可用.为了编辑方便,所有的Go语言关键字和操作符都使用ASCII编码字符,但是Go语言中标识符可以是任一Uni

GO语言的进阶之路-Golang高级数据结构定义

GO语言的进阶之路-Golang高级数据结构定义 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 我们之前学习过Golang的基本数据类型,字符串和byte,以及rune也有所了解,但是说起高级点的数据类型,可能我们还是不太清楚,那么今天就跟着我脚步一起学习一下这些高级数据类型数据吧.相信有部分人可能学习过Python,那么我这篇博客基本上不用看了,因为对你来说会觉得so easy.因为太多的相似之处了,只是写法不同.本章主要介绍数组(array),切片(scice),字典(m

go语言学习(五)——面向对象编程

主要讲的是"类"和接口&和其他传统语言不一样的地方挺多的,断断续续看了好几天 下面是我的练习代码 // GoStudy0219 project main.go /* go语言学习--面向对象编程(1) go中类型的值语义和引用语义 结构体(类)的定义和初始化 */ package main import ( "fmt" ) func main() { //几种"类"的初始化 v1 := &character{"Tom&q

JavaScript 精粹 基础 进阶(8)OOP面向对象编程(上)

转载请注明出处 原文连接 http://blog.huanghanlian.com/article/5b698f14b8ea642ea9213f50 面向对象编程,oop并不是针对与javascript,很多语言都实现了oop这样一个编程发法论,比如说java,c++,都是实现了oop的语言. 概念与继承 概念 面向对象程序设计(Object-oriented programming OOP)是一种程序设计范型,同时也是一种程序开发的方法.对象指的是类的实例,它将对象作为程序的基本单元,将程序和

python之路---面向对象编程(一)

一.设计思想的发展 面向机器(代码复杂,效率低,学习成本高,开发周期长)-------->面向过程(扩展性差,不适用多变的需求改变)----------->面向对象(扩展性好,但是可控性差) 二.面向过程和面向对象对比 面向过程: 定义:面向过程的核心是过程(即流水线式设计),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西. 优点是:极大的降低了程序的复杂度 缺点是:一套流水线或者流程就是用来解决一个问题,生产汽水的流水线无法生产汽车,即便是能,也

python之路---面向对象编程(二)

类的继承 1.在python3中,只有新式类,新式类的继承方式为:广度优先.而python2中,经典类的继承方式为:深度优先.那么我们来看看深度优先和广度优先的区别吧 如下图,为类之间的继承关系.B,C继承A,D继承B,E继承C,F继承D,E   深度优先: class A: # def foo(self): # print 'from A' pass class B(A): # def foo(self): # print 'from B' pass class C(A): # def foo

C语言程序设计进阶 第1周编程题

第1周编程题 查看帮助 返回 依照学术诚信条款,我保证此作业是本人独立完成的. 温馨提示: 1.本次作业属于Online Judge题目,提交后由系统即时判分. 2.学生可以在作业截止时间之前不限次数提交答案,系统将取其中的最高分作为最终成绩. 1 字符串比对(10分) 题目内容: 题目说起来很简单,你会读到两个字符串,每个字符串占据一行,每个字符串的长度均小于10000字符,而且第一个字符串的长度小于第二个字符串的.你的程序要找出第一个字符串在第二个字符串中出现的位置,输出这些位置,如果找不到

网易云课堂_C语言程序设计进阶_期末考试编程题部分

123123 1 字符串循环右移(5分) 题目内容: 输入一个字符串和一个非负整数N,要求将字符串循环右移N次. 输入格式: 输入在第1行中给出一个字符串,以'#'表示结束,‘#’不是字符串的一部分,字符串的长度未知,但至少有一个字符:输入的第2行给出非负整数N. 输出格式: 在一行中输出循环右移N次后的字符串. 输入样例: Hello World!# 2 输出样例: d!Hello Worl 时间限制:500ms内存限制:32000kb 2 最小包围矩形(5分) 题目内容: 给定一组二维坐标,

JavaScript 精粹 基础 进阶(9)OOP面向对象编程(下)

转载请注明出处 原文连接 http://blog.huanghanlian.com/article/5b698f22b8ea642ea9213f51 我们怎么去模拟重载,在javasceipr中我们可以通过参数的类型区别或者数量的区别,来去让同样一个函数名字,可以根据不同的参数列表的情况来去调用相应的函数. javascript中函数类型是不确定的,并且参数的个数也是可以任意的,那么我们可以通过判断实际传入的参数的个数,来去做一个模拟的重载, OOP(模拟重载.链式调用.模块化) 模拟重载 fu