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...