Go方法是作用在接收器(receiver)上的一個函數,接收器是某種類型的變量,因此方法是一種特殊類型的函數。
接收器類型可以是任何類型,不只是結構體類型,任何類型都可以有方法,甚至可以是函數類型,也可以是int、bool、string或陣列的別名類型。
但是接收器不能是一個接口類型,因為接口是一個抽象定義,而方法卻是具體實現,如果將接收器定義為接口類型,會引發一個編釋上的錯誤:invalid receiver type。
在面向對象編程裡,一個很重要的觀念是傳值或是傳引用,前者會複製一份參數讓方法使用,方法裡對參數的操作都不會影響傳入的參數數值,如果我們想要保存方法對參數的改動,那麼就必須選擇傳引用而非傳值。
type user struct{
name string
age int
}
func (u user) func1(){
//do something
}
值接收器操作的是值的拷敗,在函數內的操作皆不影響原來的數值。
func (u user) func12(){
//do something
}
指針接收器傳遞的是引用,函數內所有的改動都會保存在參數裡頭。
如果要在方法中更改接收器的狀態,操縱它的值,請使用指針接受器。如果方法綁定的結構體非常大,使用指針接收器會是比值接收器更加有效率。
如果你不需要編輯接收器之值,請使用值接收器。值接收器是併發安全的,而指針接收器並不是併發安全的。
對於新手來說,選擇在方法使用值或指針接收器可能有些困難,當新手有疑問時,就使用指針接收器。
指針接收器
func (u user) func12(){ --> u *user
//do something
}
Go CodeReview的建義 --> 建議
則接收器必須是避免覆制的指針。 --> 複製