Go語言基礎:method

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

我們在C語言中,struct中聲明函數,而Go中則不能再struct中聲明函數。而是採用另外一種形態存在,Go中叫method。

method的概念

method是附屬在一個給定的類型上,文法和函數的聲明文法幾乎一樣,只是再func後面增加了一個recevier(也就是method所依從的主體)

method的文法格式

func (r ReceiverType) funcName(parameters) (results)

形象一點說,就是 ReceiverType 類型的所有欄位,方法 funcName 都是可以使用的,可以認為 funcName 屬於 ReceiverType。

method簡單應用

package mainimport (    "fmt"    "math")type Rectangle struct {    width, height float64}type Circle struct {    radius float64}func (r Rectangle) area() float64 {    return r.width * r.height}func (c Circle) area() float64 {    return c.radius * c.radius * math.Pi}func main() {    r1 := Rectangle{12, 2}    r2 := Rectangle{9, 4}    c1 := Circle{10}    c2 := Circle{25}    fmt.Println("Area of r1 is: ", r1.area())    fmt.Println("Area of r2 is: ", r2.area())    fmt.Println("Area of c1 is: ", c1.area())    fmt.Println("Area of c2 is: ", c2.area())}

輸出:

Area of r1 is:  24Area of r2 is:  36Area of c1 is:  314.1592653589793Area of c2 is:  1963.4954084936207

Rect 和 Circle 以及附屬在他們身上的 area() 方法關係如所示:

  • method 是通過 . 來訪問,就像訪問struct裡面欄位一樣。
  • method 裡面可以訪問接受者的欄位,比如 r1.area() 就可以訪問 r1 裡面的 width 和 height。
  • 雖然 method 的名字是一樣的,但是不同的 receiver 不一樣,那麼 method 就不一樣。這一點很重要哦。
  • 還有一點,method不僅能作用再struct上,也可以定義再任何自訂的類型、內建類型等各種類型上面
  • method 中的 receiver 可以是值傳遞,也可以是指標。指標的話,就可以直接修改 receiver 中的內容

method的指標用法

格式:

func (r *ReceiverType) funcName(parameters) (results)

看例子:

package mainimport "fmt"type person struct {    name string    age  int32}func (p *person) setPerson(name string, age int32) {    p.name = name    p.age = age}func main() {    p := new(person)    p.setPerson("uu_dou", 15)    fmt.Println(p.name)    fmt.Println(p.age)}

輸出:

uu_dou15

如果上例中的 receiver 不是指標,則輸出:

 //name什麼都沒有0 //age 預設為0

對比前面一個例子,不難發現不管 method 中的 receiver 是值傳遞,還是指標,都是通過 . 符號訪問,因為 Go 知道 receiver 是不是指標。

method繼承和重寫

繼承:如果 struct 中的一個匿名段實現了一個 method,那麼包含這個匿名段的 struct 也能調用該 method。
重寫:如果 struct 中的一個匿名段實現了一個 method,包含這個匿名段的 struct 是可以重寫匿名欄位的方法的。

總結

method的相關知識是Go實現物件導向的重要基礎,掌握它很重要。它與 java、c++ 不一樣,沒有任何的 private、public等關鍵詞,依然通過大小寫來實現(大寫開頭的為共有,小寫開頭的為私人),方法也同樣適用這個原則。

相關文章

聯繫我們

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