GO語言對方法傳值和方法集的理解

2021-10-02 16:59:00 字數 1781 閱讀 9251

go語言中的方法和函式的區別就是方法多了乙個傳值,例如:

函式:

func notify()
方法:

func (u *user) notify()
首先要明確兩個定義,乙個就是方法定義時選擇的接收者,也就是(u *user),可以是值接收者,

也可以是指標接收者;另乙個定義就是你在使用方法時傳入的值是指標還是值。

在通常情況下,go會在執行的時候儘量減少錯誤,比如:

1、當方法是值接收者,你傳的值是指標的時候

type n inte***ce 

type user struct

func (u user) notify()

func main()

u.notify()

}

這時能正常執行,因為go在**執行的背後轉為 (*u).notify(),這是go編輯器為了支援這種方法

呼叫背後做的事情,指標被解引用為值,這樣就符合了值接收者的要求,notify操作的是乙個副本,

只不過這次操作的是從u指標指向的值的副本。

2、當方法是指標接收者,你傳的值是值的時侯(重複**不再寫,如上):

func (u *user) notify()
func main()

u.notify()

}

這時能正常執行,因為go在**執行的背後轉為 (&u).notify(),go首先引用u值得到了

乙個指標,這個指標再匹配方法的接收者型別進行呼叫。

以上是一種正常的情況,但是並不是所有的情況go都能進行轉化,這是就出現了方法集。

規範描述的方法集:

values(你傳入的值):t(值型別)          mr(方法定義的接收者型別):t(值型別)

values(你傳入的值):*t(指標型別)          mr(方法定義的接收者型別):t(值型別) 和 *t(指標型別)

如果上面看的彆扭的話,可以從接收者型別的角度來看:

mr(方法定義的接收者型別):t(值型別)                values(你傳入的值):t(值型別)和 *t(指標型別)

mr(方法定義的接收者型別):*t(指標型別)         values(你傳入的值):*t(指標型別)

也就是說方法定義的時候是值接受者型別,在用的時候就可以傳入值型別和指標型別,

如果方法定義的時候是指標型別,在用的時候就只能是指標型別,因為有的情況go並不能獲得指標,比如:

1、

type n inte***ce 

type user struct

func (u *user) notify()

func main()

s(u) //重點

}func s(n n)

這段程式在編譯器會直接報錯,s(u) 這行錯誤,因為方法定義的是指標接收者,這樣傳進s函式的就是

乙個複製後的值,go不能再找到原來的值的位址,就會報錯,可以改為s(&u),就正確了。

2、

type n inte***ce 

type user struct

func (u *user) notify()

func main().notify()

}

這段**中,main函式中,go也找不到位址,也會報錯,所以方法集定義的規則在哪種情況下都不會出錯,

也就是強調了指標接收者的情況下,傳入的值必須是位址。

GO語言中的方法值和方法表示式的使用方法詳解

go語言也稱 golang,兼具效率 效能 安全 健壯等特性。手冊上關於這塊的解釋感覺不是很詳細清晰,經過幾個示例自己總結了下這塊的用法。方法表示式 說簡單點,其實就是方法物件賦值給變數。這裡有兩種使用方式 1 方法值 隱式呼叫,struct例項獲取方法物件 2 方法表示式 顯示呼叫,struct型...

springMvc請求的跳轉和傳值的方法

forword跳轉頁面的三種方式 1.使用serlvet?1 2345 6789 1011 12 使用forward跳轉,傳遞基本型別引數到頁面 注意 1.使用servlet原生api request作用域 2.使用model物件?1 2345 6789 1011 12 使用forward跳轉,傳遞...

方法中關於形參的傳值和傳址問題

package com.test class a public class test a aa new a aa.jiaohuan a for int b a 這就是址傳遞 因為我們定義的陣列a。它的變數名是指向他的首位址。在傳遞的過程中穿的是位址。位址傳遞。傳給形參。此時形參值會影響實參值 pac...