Go語言的物件導向(OOP)

來源:互聯網
上載者:User

標籤:actor   factor   IV   class   關鍵字   聲明   結構體   指標方法   種類   

一、方法

在函式宣告時,在其名字之前放上一個變數,即是一個方法。這個附加的參數會將該函數附加到這種類型上,即相當於為這種類型定義了一個獨佔的方法。如:

package geometryimport "math"type Point struct{ X, Y float64 }// traditional functionfunc Distance(p, q Point) float64 {    return math.Hypot(q.X-p.X, q.Y-p.Y)}// same thing, but as a method of the Point typefunc (p Point) Distance(q Point) float64 {    return math.Hypot(q.X-p.X, q.Y-p.Y)}p := Point{1, 2}q := Point{4, 6}fmt.Println(Distance(p, q)) // "5", function callfmt.Println(p.Distance(q))  // "5", method call

上方代碼裡附加的參數p,叫做方法的接收器(receiver)。Go語言中不像其它語言使用this或self作為接收器,我們可以任意選擇接收器的名字。為保持其在方法間傳遞時的一致性和簡短性,建議使用其類型的第一字母。

當接收器變數本身比較大時(拷貝消耗資源較多),我們可以用其指標而不是對象來聲明方法。如:

func (p *Point) ScaleBy(factor float64) {    p.X *= factor    p.Y *= factor}p := Point{1, 2}(&p).ScaleBy(2)fmt.Println(p) // "{2, 4}"

如果接收器p是一個Point類型的變數,並且其方法需要一個Point指標作為接收器,我們可以簡寫為p.ScaleBy(2)。編譯器會隱式的幫我們用&p去調用ScaleBy這個方法。

這種簡寫只適用於"變數",不能通過一個無法取得地址的接收器來調用指標方法,如:Point{1,2}.scaleBy(2)。

GO語言中沒有類似C++的Class關鍵字,以及直接的對象繼承。不過可以通過嵌入結構體來擴充類型,在類型中內嵌的匿名欄位也可以是一個命名類型的指標。如下:

type ColoredPoint struct {    *Point    color.RGBA}

待續

Go語言的物件導向(OOP)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.