最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

go 指針接收者和值接收者的區(qū)別小結(jié)

 更新時(shí)間:2025年04月17日 11:30:46   作者:思無邪_  
在Go 語言中,值接收者和指針接收者是方法定義中的兩種接收者類型,本文主要介紹了go 指針接收者和值接收者的區(qū)別小結(jié),文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

go 指針接收者和值接收者的區(qū)別

指針接收者和值接收者的區(qū)別主要有兩點(diǎn):

  • Go 中函數(shù)傳參是傳值,因此指針接收者傳遞的是接收者的指針拷貝,值接收者傳遞的是接收者的拷貝---在方法中指針接收者的變量會被修改,而值接收者的成員變量修改是無效的(畢竟傳入的是拷貝,修改的自然也是拷貝的成員變量)。
  • 在接口實(shí)現(xiàn)上,如果值接收者實(shí)現(xiàn)了某個(gè)方法,相當(dāng)于值接收者和指針接收者都實(shí)現(xiàn)了這個(gè)方法。反之則不行,即指針接收者實(shí)現(xiàn)了某個(gè)方法,不能看成值接收者實(shí)現(xiàn)這個(gè)方法。

注意第2點(diǎn)只影響接口實(shí)現(xiàn),如果不涉及接口的話是不受到這條規(guī)則約束的。

一個(gè)助記的但是不太正確的觀點(diǎn):接收者是指針類型的方法,很可能在方法中會對接收者的屬性進(jìn)行更改操作,從而影響接收者;而對于接收者是值類型的方法,在方法中不會對接收者本身產(chǎn)生影響。

理解角度:指針接收者可以選擇修改自己的值和不修改,值接收者修改自己的值是無效的(因?yàn)槭强截悾?。所以可以看成指針接收者的能?gt;值接收者的能力,自然:指針接收者實(shí)現(xiàn)某個(gè)方法可以看成值接收者實(shí)現(xiàn)某個(gè)方法,反之則不行。

package main

import "fmt"

type coder interface {
    code()
    debug()
}

type Gopher struct {
    language string
}

func (p Gopher) code() {
    fmt.Printf("I am coding %s language\n", p.language)
}

func (p *Gopher) debug() {
    fmt.Printf("I am debuging %s language\n", p.language)
}

func main() {
    var c coder = &Gopher{"Go"} //運(yùn)行正常
    //上一行換成: var c coder = Gopher{"Go"} 
    // 則報(bào)錯 Gopher does not implement coder (debug method has pointer receiver)
    c.code()
    c.debug()
}

注意??:對于????上面的第 2 點(diǎn)補(bǔ)充:雖然隱式實(shí)現(xiàn)的方法不一樣,但是如果不涉及接口,單純在調(diào)用的時(shí)候,無論是指針接收者還是值接收者實(shí)現(xiàn)了某個(gè)方法,指針接收者和值接收者都可以調(diào)用。本質(zhì)上是 go 的語法糖。

最佳實(shí)踐:

如果類型具備“原始的本質(zhì)”,即其成員都是由 Go 語言里內(nèi)置的原始類型,如字符串,整型值等,那就定義值接收者類型的方法。

內(nèi)置的引用類型,如 slice,map,interface,channel,這些類型比較特殊,聲明他們的時(shí)候,實(shí)際上是創(chuàng)建了一個(gè) header?, 對于他們也是直接定義值接收者類型的方法。這樣,調(diào)用函數(shù)時(shí),是直接 copy 了這些類型的 header?,而 header? 本身就是為復(fù)制設(shè)計(jì)的。

如果類型具備非原始的本質(zhì),不能被安全地復(fù)制,這種類型總是應(yīng)該被共享,那就定義指針接收者的方法。

雖然上面是這么說,但是個(gè)人感覺在實(shí)際使用中,基本可以無腦使用指針接收者。主要原因在于:1.指針接收者沒有值拷貝帶來的巨大開銷。2.如果就想在函數(shù)中修改值就必須使用指針接收者。3.值接收者唯一的優(yōu)勢就是為了防止意外的修改,為了防止這一點(diǎn)可以通過創(chuàng)建一個(gè)函數(shù)或者方法來手動 copy,而這并不會帶來多大的開銷。

易錯點(diǎn)辨析

是否改變結(jié)構(gòu)體的值看的是方法是指針接收者還是值接收者,而不是看調(diào)用方是指針還是值。原因在于golang編譯器在背后會完成一些工作,比如:解引用,隱式使用引用。代碼范例如下:

package main

import "fmt"

type Node struct {
    val int
}

func (receiver Node) changeVal1() {
    receiver.val++
}

func (receiver *Node) changeVal2() {
    receiver.val++
}
func main() {
    someOne := Node{}
    someOne.changeVal1()
    fmt.Printf("%d\n", someOne.val) //0 ,說明沒有改值,因?yàn)榉椒ń邮照呤侵到邮照?

    someOnePtr := &Node{}
    someOnePtr.changeVal1()
    fmt.Printf("%d\n", someOnePtr.val) //0 ,說明沒有改值,因?yàn)榉椒ń邮照呤侵到邮照?,與調(diào)用方是否指針無關(guān)

    someTwo := Node{}
    someTwo.changeVal2()
    fmt.Printf("%d\n", someTwo.val) //1 ,說明成功改值,因?yàn)榉椒ń邮照呤侵羔樈邮照撸c調(diào)用方是否指針無關(guān)

    someTwoPtr := &Node{}
    someTwoPtr.changeVal2()
    fmt.Printf("%d\n", someTwoPtr.val) //1 ,說明成功改值,因?yàn)榉椒ń邮照呤侵羔樈邮照?,與調(diào)用方是否指針無關(guān)

}

參考:https://golang.design/go-questions/interface/receiver/

到此這篇關(guān)于go 指針接收者和值接收者的區(qū)別小結(jié)的文章就介紹到這了,更多相關(guān)go 指針接收者和值接收者內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Go語言基礎(chǔ)語法之結(jié)構(gòu)體及方法詳解

    Go語言基礎(chǔ)語法之結(jié)構(gòu)體及方法詳解

    結(jié)構(gòu)體類型可以用來保存不同類型的數(shù)據(jù),也可以通過方法的形式來聲明它的行為。本文將介紹go語言中的結(jié)構(gòu)體和方法,以及“繼承”的實(shí)現(xiàn)方法
    2021-09-09
  • Golang并發(fā)編程深入分析

    Golang并發(fā)編程深入分析

    golang中的并發(fā),是函數(shù)相互獨(dú)立運(yùn)行的能力,goroutines是并發(fā)運(yùn)行的函數(shù)。golang提供了goroutines作為并發(fā)處理的一種方式
    2022-11-11
  • gin自定義中間件解決requestBody不可重復(fù)讀問題(最新推薦)

    gin自定義中間件解決requestBody不可重復(fù)讀問題(最新推薦)

    這篇文章主要介紹了gin自定義中間件解決requestBody不可重復(fù)讀問題,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-04-04
  • Go歸并排序算法的實(shí)現(xiàn)方法

    Go歸并排序算法的實(shí)現(xiàn)方法

    歸并排序采用的也是分治的策略,把原本的問題先分解成一些小問題進(jìn)行求解,再把這些小問題各自的答案修整到一起得到原本問題的答案,從而達(dá)到分而治之的目的,對Go歸并排序算法相關(guān)知識感興趣的朋友一起看看吧
    2022-04-04
  • go local history本地歷史恢復(fù)代碼神器

    go local history本地歷史恢復(fù)代碼神器

    這篇文章主要為大家介紹了go local history本地歷史恢復(fù)代碼神器的使用功能詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01
  • Golang?Configor配置文件工具的使用詳解

    Golang?Configor配置文件工具的使用詳解

    Configor是一個(gè)支持?yaml、json、toml、shell?的配置文件工具,這篇文中主要為大家詳細(xì)介紹了Configor的具體使用,感興趣的小伙伴可以學(xué)習(xí)一下
    2023-08-08
  • Go語言滑動窗口最大值的實(shí)現(xiàn)示例

    Go語言滑動窗口最大值的實(shí)現(xiàn)示例

    本文主要介紹了Go語言滑動窗口最大值的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-08-08
  • 一文帶你吃透Golang中net/http標(biāo)準(zhǔn)庫服務(wù)端

    一文帶你吃透Golang中net/http標(biāo)準(zhǔn)庫服務(wù)端

    這篇文章將從服務(wù)端(Server)作為切入點(diǎn)和大家分享一下Go語言net/http標(biāo)準(zhǔn)庫的實(shí)現(xiàn)邏輯,進(jìn)而一步步分析http標(biāo)準(zhǔn)庫內(nèi)部是如何運(yùn)作的,感興趣的可以了解下
    2024-03-03
  • 詳解Go語言中make和new的區(qū)別

    詳解Go語言中make和new的區(qū)別

    Go語言中,有兩個(gè)比較雷同的內(nèi)置函數(shù),分別是new和make方法,那他們有什么區(qū)別呢?本文將通過一些示例為大家詳細(xì)介紹一下,感興趣的可以了解一下
    2023-02-02
  • go語言中time包的各種函數(shù)總結(jié)

    go語言中time包的各種函數(shù)總結(jié)

    時(shí)間和日期是我們編程中經(jīng)常會用到的,下面這篇文章主要給大家介紹了關(guān)于go語言中time包的各種函數(shù)總結(jié)的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-04-04

最新評論

平原县| 湖州市| 顺昌县| 凤阳县| 濮阳县| 兴隆县| 修武县| 穆棱市| 海淀区| 汤原县| 南川市| 淅川县| 永康市| 封开县| 翁源县| 宾川县| 和硕县| 庆元县| 桐城市| 白朗县| 志丹县| 婺源县| 潜江市| 玉环县| 临沧市| 靖西县| 彰武县| 剑阁县| 内乡县| 隆回县| 萍乡市| 中阳县| 成都市| 土默特左旗| 城步| 会理县| 图片| 驻马店市| 天津市| 新干县| 临清市|