Go方法和介面

2022-07-11 16:30:16 字數 2653 閱讀 7733

go沒有類,不過可以通過為結構體型別定義方法。

方法只是一類帶特殊的接收者引數的函式

import "math"

type point struct

// 計算兩個點之間的距離

// 函式

func distance(p, q point) float64

// 方法

func (p point) distance(q point) float64

上面的**裡那個附加的引數p,叫做方法的接收器(receiver).

在go語言中,我們並不會像其它語言那樣用this或者self作為接收器;我們可以任意的選擇接 收器的名字。由於接收器的名字經常會被使用到,所以保持其在方法間傳遞時的一致性和簡 短性是不錯的主意。這裡的建議是可以使用其型別的第乙個字母,比如這裡使用了point的首字母p。

我們也可以為非結構體型別宣告方法,只需借助type關鍵字

type myfloat float64

func (mf myfloat)foo() float64

return float(mf)

}

如果想改修改接收器物件,我們可以通過指標的方式。

當接收者本省比較大時,我們也可以通過指標來宣告物件。因為通過物件直接宣告的時候,呼叫會產生一次拷貝,浪費空間。

//修改point的座標

type point struct

// 函式

func (p point)modify(x, y float64)

//方法

func (p *point) modify(x, y float64)

func main()

p.modify(0,0)

fmt.println(p) //

(&p).modify1(0,0)

fmt.println(p) //

p.modify1(9,9)

fmt.println(p) //

//不管你的method的receiver是指標型別還是非指標型別,都是可以通過指標/非指標型別 進行呼叫的,編譯器會幫你做型別轉換。

}

不管你的method的receiver是指標型別還是非指標型別,都是可以通過指標/非指標型別 進行呼叫的,編譯器會幫你做型別轉換。

nil是乙個合法的接收器型別

就像一些函式允許nil指標作為引數一樣,方法理論上也可以用nil指標作為其接收器,尤其當 nil對於物件來說是合法的零值時,比如map或者slice。在下面的簡單int鍊錶的例子裡,nil代表的是空鍊錶:

type intlist strcut

//求鍊錶的和

func (list *intlist) sum() int

return list.value + list.next.sum()

}

p.distance()我們可以將其分成兩步執行。p.distance叫做選擇器,選擇器會返回乙個方法「值」:乙個將方法(p.distance)繫結到特定接收器變數的函式。這個函式可以不通過指定其接收器即可被呼叫:即呼叫的時候不用指定接收器,因為前面宣告的時候已經指定了。

p := point

q := point

distancefromp := p.distance // distancefromp方法值 p.distance方法表示式

fmt.println(distancefromp(q)) // "5"

var origin point //

fmt.println(distancefromp(origin)) // "2.23606797749979", sqrt(5)

乙個物件的變數或者方法如果對呼叫方是不可見的話,一般就被定義為「封裝」。封裝有時候也 被叫做資訊隱藏,同時也是物件導向程式設計最關鍵的乙個方面。

go語言只有一種控制可見性的手段:大寫首字母的識別符號會從定義它們的包中被匯出,小寫字母的則不會。這種限制包內成員的方式同樣適用於struct或者乙個型別的方法。因而如果我 們想要封裝乙個物件,我們必須將其定義為乙個struct。

這種基於名字的手段使得在語言中最小的封裝單元是package,而不是像其它語言一樣的類 型。乙個struct型別的字段對同乙個包的所有**都有可見性,無論你的**是寫在乙個函式 還是乙個方法裡。

介面型別是對其它型別行為的抽象和概括;因為介面型別不會和特定的實現細節繫結在一 起,通過這種抽象的方式我們可以讓我們的函式更加靈活和更具有適應能力。 很多物件導向的語言都有相似的介面概念,但go語言中介面型別的獨特之處在於它是滿足隱 式實現的。也就是說,我們沒有必要對於給定的具體型別定義所有滿足的介面型別;簡單地 擁有一些必需的方法就足夠了。這種設計可以讓你建立乙個新的介面型別滿足已經存在的具 體型別卻不會去改變這些型別的定義;當我們使用的型別來自於不受我們控制的包時這種設 計尤其有用。

介面型別是一種抽象的型別。它不會暴露出 它所代表的物件的內部值的結構和這個物件支援的基礎操作的集合;它們只會展示出它們自 己的方法。

9 筆記go語言 方法和介面

9.筆記go語言 方法和介面 go 沒有類。然而,仍然可以在結構體型別上定義方法。方法接收者 出現在 func 關鍵字和方法名之間的引數中。package main import fmt math type vertex struct func v vertex abs float64 func m...

Go 結構體 方法 介面

go 語言中沒有 類 的概念,也不支援像繼承這種物件導向的概念。但是go 語言的結構體與 類 都是復合結構體,而且go 語言中結構體的組合方式比物件導向具有更高的擴充套件性和靈活性。7.1.1 結構體定義 結構體一般定義如下 type identifier struct 例如我們想宣告乙個學生的結構...

Go結構體 方法 介面

go 語言中沒有 類 的概念,也不支援像繼承這種物件導向的概念。但是go 語言的結構體與 類 都是復合結構體,而且go 語言中結構體的組合方式比物件導向具有更高的擴充套件性和靈活性。7.1.1 結構體定義 結構體一般定義如下 type identifier struct 例如我們想宣告乙個學生的結構...