GO語言的進階之路-物件導向編程

來源:互聯網
上載者:User

標籤:空間   比較   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語言的進階之路-物件導向編程

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.