Golang(Go 語言)入門學習 7 方法

2021-08-17 22:18:31 字數 3157 閱讀 9114

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

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

方法接收者在它自己的引數列表內,位於 func 關鍵字和方法名之間。

在此例中,abs 方法擁有乙個名為 v,型別為 vertex 的接收者。

package main

import (

"fmt"

"math"

)type vertex struct

func (v vertex) abs() float64

func main()

fmt.println(v.abs())

}

輸出

5
記住:方法只是個帶接收者引數的函式。

現在這個 abs 的寫法就是個正常的函式,功能並沒有什麼變化。

package main

import (

"fmt"

"math"

)type vertex struct

func abs(v vertex) float64

func main()

fmt.println(abs(v))

}

輸出

5
你也可以為非結構體型別宣告方法。

在此例中,我們看到了乙個帶 abs 方法的數值型別 myfloat。

你只能為在同一包內定義的型別的接收者宣告方法,而不能為其它包內定義的型別(包括 int 之類的內建型別)的接收者宣告方法。

就是接收者的型別定義和方法宣告必須在同一包內;不能為內建型別宣告方法。)

你可以為指標接收者宣告方法。

這意味著對於某型別 t,接收者的型別可以用 *t 的文法。(此外,t 不能是像 *int 這樣的指標。)

例如,這裡為 *vertex 定義了 scale 方法。

指標接收者的方法可以修改接收者指向的值(就像 scale 在這做的)。由於方法經常需要修改它的接收者,指標接收者比值接收者更常用。

試著移除第 16 行 scale 函式宣告中的 *,觀察此程式的行為如何變化。

若使用值接收者,那麼 scale 方法會對原始 vertex 值的副本進行操作。(對於函式的其它引數也是如此。)scale 方法必須用指標接受者來更改 main 函式中宣告的 vertex 的值。

package main

import (

"fmt"

"math"

)type vertex struct

func (v vertex) abs() float64

func (v *vertex) scale(f float64)

func main()

v.scale(10)

fmt.println(v.abs())

}

輸出

50
現在我們要把 abs 和 scale 方法重寫為函式。

package main

import (

"fmt"

"math"

)type vertex struct

func abs(v vertex) float64

func scale(v *vertex, f float64)

func main()

scale(&v,10)

fmt.println(abs(v))

}

輸出

50
比較前兩個程式,你大概會注意到帶指標引數的函式必須接受乙個指標:

var v vertex

scalefunc(v, 5)

// 編譯錯誤!

scalefunc(&v, 5)

// ok

而以指標為接收者的方法被呼叫時,接收者既能為值又能為指標:

var v vertex

v.scale(5) // ok

p := &v

p.scale(10) // ok

對於語句 v.scale(5),即便 v 是個值而非指標,帶指標接收者的方法也能被直接呼叫。 也就是說,由於 scale 方法有乙個指標接收者,為方便起見,go 會將語句 v.scale(5) 解釋為 (&v).scale(5)。

package main

import "fmt"

type vertex struct

func (v *vertex) scale(f float64)

func scalefunc(v *vertex, f float64)

func main()

v.scale(2)

scalefunc(&v, 10)

p := &vertex

p.scale(3)

scalefunc(p, 8)

fmt.println(v, p)

}

輸出

&{96 72

同樣的事情也發生在相反的方向。

接受乙個值作為引數的函式必須接受乙個指定型別的值:

var v vertex

fmt.println(absfunc(v)) // ok

fmt.println(absfunc(&v)) // 編譯錯誤!

而以值為接收者的方法被呼叫時,接收者既能為值又能為指標:

var v vertex

fmt.println(v.abs()) // ok

p := &v

fmt.println(p.abs()) // ok

這種情況下,方法呼叫 p.abs() 會被解釋為 (*p).abs()。

使用指標接收者的原因有二:

首先,方法能夠修改其接收者指向的值。

其次,這樣可以避免在每次呼叫方法時複製該值。若值的型別為大型結構體時,這樣做會更加高效。

Golang Go語言學習資源集合

說明 對於新手來講,入門一門新的語言無疑是有困難的,往往會因為找不到方向而迷失。在我的學習golang的過程中,也碰到了該如何入手的問題,還好我善於搜尋,有一些基礎,入手的時候沒有碰到太多困難。但是如果想深入理解這門語言我做的還不夠,所以找了一些學習的資源,這些資源我都會至少翻看一些,並不只是單純列...

讀書筆記 golang 《go語言 雲動力》

第二章到第六章都在講一些無關緊要的東西,主要是golang的語法基礎,比如運算,型別,字串,陣列,切片,結構體,指標,這些和c以及cpp都有很多類似的地方,golang的切片是上述二者不具備的,但是像cpp會有vector這種東西來代替,這一段的內容基本上每本相關的語法書都會有提到。但是本書也會討論...

C語言入門學習

計算機能夠識別和接受的語言。要使計算機按自己的意圖工作,必須使用計算機所能接受 理解和執行的指令指揮計算機工作。最早問世,用二進位制 構成指令。如 100000 110000 用機器語言程式設計的缺點 繁瑣 不直觀 不易除錯。如計算y 2x2 3x 1需要七八條指令。移植性差。依賴於計算機。用符號構...