c++是一種物件導向的程式語言,我們可以為類提供成員變數和成員方法。而在go中沒有類的概念,但是也提供了類似的機制來表示,那就是方法。
go語言中的方法(method)是一種作用於特定型別變數的函式。這種特定型別變數叫做接收器(receiver)。如果將特定型別理解為結構體或類,那接收器的概念就類似於其他語言中的this或者self.
在go語言中,接收器的型別可以是任何型別,不僅僅是結構體,任何型別都可以擁有方法,但必須是通過type定義的型別。
func (接收器變數 接收器型別) 方法名(引數列表) (返回引數)
舉例說明:
package main
import "fmt"
type bag struct
//面向過程
func insert(b *bag, itemid int)
//類似物件導向
func (b *bag)insert_method(itemid int)
func main()
接收器的型別分為指標接收器和非指標接收器。兩種接收器在使用時會產生不同的效果。根據效果的不同,兩種接收器會被用於不同效能和功能要求的**中。
指標型別的接收器由乙個結構體的指標組成,更接近於物件導向中的this或者self.
由於指標的特性,呼叫方法時,修改接收器指標的任意成員變數,在方法結束後,修改都是有效的。、
當方法作用於非指標接收器時,go語言會在**執行時將接收器的值複製乙份。在非指標接收器的方法中可以獲取接收器的成員值,但修改後無效。
在計算機中,小物件由於值複製時的速度比較快,所以適合使用非指標接收器。大物件因為複製效能低,適合使用指標接收器,在接收器和引數間傳遞時不進行複製,只傳遞指標。
無論是普通函式還是結構體的方法,只要它們的簽名一致,與它們簽名一致的函式變數就可以儲存普通函式或結構體方法。
package main
import "fmt"
type class struct
func (c *class) do(v int)
func funcdo(v int)
func main()
GO語言學習筆記(九 方法 method)
方法method go中雖沒有class,但依舊有method 通過顯示說明receiver來實現某個型別的組合 只能為同乙個包中的型別定義方法 receiver可以是型別的值或者指標 不存在方法過載 可以使用值或者指標來呼叫方法,編譯器自動完成轉換 從某種意義上說,方法是函式的語法糖,因為rece...
Go語言學習Part4 1 方法和介面
熱 愛是力量之泉!case 1 package main import fmt math type pos struct func temp pos abs float64 func sum temp pos float64 func main fmt.println sum v case 2 pa...
go 方法 摘自go語言學習筆記
如何選擇方法的receiver型別 要修改例項狀態,用 t 無須修改狀態的小物件或固定值,建議用t 大物件建議用 t,以減少複製成本 引用型別 字串 函式等指標包裝物件,直接用t 若包含mutex等同步字段,用 t,避免因複製造成鎖操作無效 其他無法確定的情況,都用 t 方法集 型別t方法集包含所有...