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需要七八條指令。移植性差。依賴於計算機。用符號構...