標籤:空間 比較 run 相同 分享 網頁 運行 一句話 port
GO語言的進階之路-物件導向編程
尹正傑
著作權聲明:原創作品,謝絕轉載!否則將追究法律責任。
當你看完這篇文章之時,我可以說你的Golang算是入門了,何為入門?就是你去看Docker 源碼能看懂60%的文法結構,因為涉及一些unix的代碼可能沒有Linux營運基礎的同學在學習的時候會很吃力,看起來也會帶來一定的難度,如果有時間的話我會給大家解析Docker部門精闢的源碼。好了,迴歸正題吧,我們今天要學習的內容是什麼呢?即物件導向編程。當然,不要用屌絲的心態來說:“那要是沒對象的還咋編程呢?”,哈哈~正傑要告訴你的是:“此對象非彼對象”,沒有“對象”照樣編程啊!那麼問題來了,到底什麼事物件導向編程呢?
一.什麼是物件導向編程;
在Golang的對象可以用一句話總結:“物件導向就是將要處理的資料跟函數進行綁定的方法”。
如果你從來沒有學過Python的話就是可以理解是class,如果在學習Golang之前從來沒有接觸過其他語言(比如說我)的話,那麼你可以這樣理解:“它是一種編程風格,就是把一切東西看成一個個對象,比如人,車,麵包,等等,然後把這些對象擁有的屬性變數,比如年齡,民族,工作地點,變質期,壽命,還有操作這些屬性變數的函數打包成一個類來表示,這個類的一個抽象就是一個對象,比如人這個類包含一些屬性,比如年齡,名字,住址等,他還有一些對別人告訴這些屬性的功能,比如:說,看,走等!!”。這就是的物件導向的特點!!!
二.為什麼要有物件導向編程;
說到物件導向編程,就不得不說一下面向過程編程,我上次跟大家分享過面向過程編程的方法,也就是定義一些函數,減少了代碼的重複性,增加了代碼的擴充性和易讀性等等。而且當大家“啪啪啪”代碼敲的起勁的時候突然冒出個物件導向,對它的出現不免會有所疑惑,面向過程已經如此好了,幹嘛還要物件導向呢?其實,我們舉個例子來說明一下你就知道了。比如讓你寫一個人的模型,用函數寫你要如果實現呢?比如現在要讓你寫關於:“劉德華,範冰冰,蔡依林”他們三個人的特點,沒錯,你可以面向過程式編程用函數將他們的特點定義 出來,那麼問題來了,如果我想在外部調用“劉德華”或是“範冰冰”的特點該如果還實現呢?用函數可能非常難以實現。因為面向過程式編程雖然不印象實現的功能,但是其複雜度很低,所以,在實現一些功能上可能欠缺點火候。
這個時候,物件導向就思想就出來啦,物件導向就可能很輕鬆的實現在外部調用“劉德華”或是“範冰冰”的特點。想要瞭解更多關於物件導向的發展是可以問我的大師兄“百度”,當然也可以問下我的二師兄“Google”,在這裡不扯太多曆史了,大家多去敲一些代碼就會體現物件導向的好處,因為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 float6417 }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中的class16 X,Y float6417 }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 float6417 }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 float6426 for i := 0;i <len(path) - 1 ; i++ {27 s += path[i].Distence(path[i+1])28 }29 return s30 }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語言的進階之路-物件導向編程