Golang 學習筆記 方法

2021-10-02 09:14:48 字數 2104 閱讀 9701

(1)當使用值接收者宣告方法,呼叫時會使用這個值的乙個副本來執行。此時該型別的值不會被改變,例:

type user struct 

func (u user) changeemail0(email string)

func (u user) notify()

bill := user

bill.notify()

bill.changeemail0("[email protected]") //只對bill的乙個副本進行修改,不會改的bill本身

bill.notify()

//執行結果

// sending user email to bill// in func [email protected]

// sending user email to bill

(2)可以使用指標來呼叫使用值接收者宣告的方法,此時,指標被解引為值的副本,這樣就符合了值接收者的要求了,而原指標變數指向的值不會發生改變。例:

type user struct 

func (u user) changeemail0(email string)

func (u user) notify()

lisa := &user

lisa.notify()

//lisa為型別值的指標,而notify方法的接受者為型別值,編譯器會做如下操作:(*lisa).notify()

lisa.changeemail0("[email protected]")

//lisa為型別值的指標,而changeemail0方法的接受者為型別值,編譯器實際會做如下操作:(*lisa).changeemail("[email protected]"), 這次操作的是lisa指向的值的「副本」,不會改變lisa本身

lisa.notify()

//執行結果:

// sending user email to lisa// in func [email protected]

// sending user email to lisa

(3) 使用型別的指標呼叫指標接收者宣告的方法時,該方法會共享指標所指向的值,此時會改變指標指向的值,例:

type user struct 

func (u *user) changeemail(email string)

func (u user) notify()

lisa := &user

lisa.notify()

lisa.changeemail("[email protected]")

lisa.notify()

//執行結果:

// sending user email to lisa// sending user email to lisa

(4) 使用型別的值呼叫指標接收者宣告的方法時,該方法會共享指標所指向的值,此時會改變指標指向的值,例:

type user struct 

func (u *user) changeemail(email string)

func (u user) notify()

bill := user

bill.notify()

bill.changeemail("[email protected]")

//bill為型別值,而changeemail方法的接收者為指標,編譯器實際會做如下操作:

// (&bill).changeemail("[email protected]"),對指標指向的值進行修改,會改變bill本身的字段(屬性)值

bill.notify()

// 執行結果:

// sending user email to bill// sending user email to bill

Golang學習筆記

如果乙個method的receiver是 t,你可以在乙個t型別的例項變數v上面呼叫這個method,而不需要 v去呼叫這個method 即不需要 v method 如果乙個method的receiver是t,你可以在乙個 t型別的變數p上呼叫這個method,而不需要 p去呼叫這個method。i...

golang學習筆記

與c語法不同之處 1.引數列表中各個引數型別相同時可以只寫出最後乙個,如 add x,y int int 2.型別在引數名 變數 函式 後面 3.函式的左大括號要跟函式名同一行,否則編譯不過 4.函式定義要先寫關鍵字func在函式開頭 函式外的每個語句都要以func var等等關鍵字開頭 5.在包或...

Golang學習筆記

package main import fmt func main break default func inte ce select case defer gomap struct chan else goto package switch const fallthrough ifrange ty...