golang方法中receiver為指針與不為指針的區(qū)別詳析
前言
golang的指針receiver和非指針receiver的區(qū)別?最近在看網(wǎng)站有同學(xué)提問(wèn)golang中方法的receiver為指針和不為指針有什么區(qū)別,在這里我以簡(jiǎn)單易懂的方法進(jìn)行說(shuō)明,幫助剛剛學(xué)習(xí)golang的同學(xué),下面話不多說(shuō)了,來(lái)一起看看詳細(xì)的介紹吧。
方法是什么
其實(shí)只要明白這個(gè)原理,基本就能理解上面提到的問(wèn)題.
方法其實(shí)就是一種特殊的函數(shù),receiver就是隱式傳入的第一實(shí)參.
舉個(gè)例子
type test struct{
name string
}
func (t test) TestValue() {
}
func (t *test) TestPointer() {
}
func main(){
t := test{}
m := test.TestValue
m(t)
m1 := (*test).TestPointer
m1(&t)
}
是不是很簡(jiǎn)單就明白了呢?現(xiàn)在我們來(lái)加入代碼,來(lái)看看指針和非指針有什么區(qū)別.
type test struct{
name string
}
func (t test) TestValue() {
fmt.Printf("%p\n", &t)
}
func (t *test) TestPointer() {
fmt.Printf("%p\n", t)
}
func main(){
t := test{}
//0xc42000e2c0
fmt.Printf("%p\n", &t)
//0xc42000e2e0
m := test.TestValue
m(t)
//0xc42000e2c0
m1 := (*test).TestPointer
m1(&t)
}
估計(jì)有的同學(xué)已經(jīng)明白了,當(dāng)不是指針時(shí)傳入實(shí)參后值發(fā)生了復(fù)制.所以每調(diào)用一次TestValue()值就發(fā)生一次復(fù)制.
那如果涉及到修改值的操作,結(jié)果會(huì)是怎樣呢?
type test struct{
name string
}
func (t test) TestValue() {
fmt.Printf("%s\n",t.name)
}
func (t *test) TestPointer() {
fmt.Printf("%s\n",t.name)
}
func main(){
t := test{"wang"}
//這里發(fā)生了復(fù)制,不受后面修改的影響
m := t.TestValue
t.name = "Li"
m1 := (*test).TestPointer
//Li
m1(&t)
//wang
m()
}
所以各位同學(xué)在編程遇到此類問(wèn)題一定要注意了.
那這些方法集之間到底是什么關(guān)系呢?這里借用了qyuhen在golang讀書筆記的話,這里也推薦喜歡golang的朋友去閱讀這本書,對(duì)加深理解golang有很大的幫助.
• 類型 T 法集包含全部 receiver T 法。
• 類型 T 法集包含全部 receiver T + T 法。
• 如類型 S 包含匿名字段 T,則 S 法集包含 T 法。
• 如類型 S 包含匿名字段 T,則 S 法集包含 T + T 法。
• 不管嵌 T 或 T,S 法集總是包含 T + *T 法。
結(jié)語(yǔ)
golang雖然上手簡(jiǎn)單易用,但是還是有很多坑.作者在使用golang過(guò)程中就遇到很多坑,以后會(huì)慢慢提出,歡迎大家一起討論.
好了,以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
Go 微服務(wù)開發(fā)框架DMicro設(shè)計(jì)思路詳解
這篇文章主要為大家介紹了Go 微服務(wù)開發(fā)框架DMicro設(shè)計(jì)思路詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10
go mock server的簡(jiǎn)易實(shí)現(xiàn)示例
這篇文章主要為大家介紹了go mock server的簡(jiǎn)易實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07
深入淺出Go語(yǔ)言:手把手教你高效生成與解析JSON數(shù)據(jù)
本文將帶你一步步走進(jìn)Go語(yǔ)言的世界,教你如何高效生成與解析JSON數(shù)據(jù),無(wú)論你是初學(xué)者還是經(jīng)驗(yàn)豐富的開發(fā)者,都能在本文中找到實(shí)用的技巧和靈感,本文內(nèi)容簡(jiǎn)潔明了,示例豐富,讓你在閱讀的過(guò)程中輕松掌握Go語(yǔ)言生成與解析JSON數(shù)據(jù)的技巧,需要的朋友可以參考下2024-02-02
Golang設(shè)計(jì)模式之責(zé)任鏈模式講解和代碼示例
責(zé)任鏈?zhǔn)且环N行為設(shè)計(jì)模式, 允許你將請(qǐng)求沿著處理者鏈進(jìn)行發(fā)送, 直至其中一個(gè)處理者對(duì)其進(jìn)行處理,本文就詳細(xì)給大家介紹一下Golang 責(zé)任鏈模式,文中有詳細(xì)的代碼示例,需要的朋友可以參考下2023-06-06
GO語(yǔ)言基礎(chǔ)庫(kù)os包的函數(shù)全面解析
這篇文章主要為大家介紹了GO語(yǔ)言基礎(chǔ)庫(kù)os包的函數(shù)全面解析, 有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12
go語(yǔ)言題解LeetCode1299將每個(gè)元素替換為右側(cè)最大元素
這篇文章主要為大家介紹了go語(yǔ)言LeetCode刷題1299將每個(gè)元素替換為右側(cè)最大元素示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01
Golang pipe在不同場(chǎng)景下遠(yuǎn)程交互
這篇文章主要介紹了Golang pipe在不同場(chǎng)景下遠(yuǎn)程交互,pipe實(shí)現(xiàn)從一個(gè)進(jìn)程重定向至另一個(gè)進(jìn)程,它是雙向數(shù)據(jù)通道,用于實(shí)現(xiàn)進(jìn)行間通信2023-03-03
Go語(yǔ)言調(diào)用ffmpeg-api實(shí)現(xiàn)音頻重采樣
最近對(duì)golang處理音視頻很感興趣,對(duì)golang音視頻常用庫(kù)goav進(jìn)行了一番研究。自己寫了一個(gè)wav轉(zhuǎn)采樣率的功能。給大家分享一下,中間遇到了不少坑,解決的過(guò)程中還是蠻有意思的,希望大家能喜歡2022-12-12

