亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用指針接收器調用函數的語法

使用指針接收器調用函數的語法

Go
LEATH 2021-05-03 13:53:24
在Go中,如果我定義了一個以指針作為接收器的函數,那么它不應該只允許從指針調用該函數嗎?為什么可以從值本身調用此函數并產生相同的效果。例如,在以下程序中:m1.reset()和m2.reset()具有相同的效果。即使m1是一個值,而m2是一個指針。我有點困惑,因為有兩種方法可以做同一件事,而且不確定要遵循哪種方法。盡管大多數代碼遵循使用指針字段調用函數的約定。我想念什么嗎?package main    import "fmt"    type MyStruct struct {        X int    }    func (m *MyStruct) reset() {        m.X = 0    }    func main() {        m1 := MyStruct{1}        m2 := &MyStruct{1}        fmt.Println(m1.X)        fmt.Println(m2.X)        m1.reset()        m2.reset()        fmt.Println(m1.X)        fmt.Println(m2.X)    }
查看完整描述

3 回答

?
慕姐4208626

TA貢獻1852條經驗 獲得超7個贊

規格

對應的指針類型* T的方法集是接收者* T或T的所有方法的集(也就是說,它也包含T的方法集)。

關于方法調用的下一條必要信息如下:

x.m()如果x的方法集(類型)包含m并且參數列表可以分配給m的參數列表,則該方法調用有效。如果x是可尋址的并且&x的方法集包含m,x.m()則是x的簡寫(&x).m()。

將以上兩個內容放在一起,您將獲得所看到的行為。


查看完整回答
反對 回復 2021-05-10
?
一只萌萌小番薯

TA貢獻1795條經驗 獲得超7個贊

提供了完美的文檔規范說明,但我想基于您的示例添加一個代碼示例。我認為您的重點應該放在“為什么有兩種方法來做同一件事”上,而不是在何時使用一種方法與另一種方法上。具有指針作為接收者的方法具有修改該接收者的值的能力,而具有具有接收者的值的方法則不能修改。這是因為這些方法接收接收者的副本。當您獲得一個指針的副本時,您仍然可以修改其值。當您收到該值的副本時,您在該方法中所做的更改只會更改副本,而不會更改原始副本:


package main


import "fmt"


type MyStruct struct {

    X int

}


func (m *MyStruct) resetPtr() {

    m.X = 0

}


func (m MyStruct) resetValue() {

    m.X = 0

}


func main() {

    m1 := MyStruct{1}

    m2 := &MyStruct{1}


    fmt.Println("Original Values:", m1.X, m2.X)


    m1.resetPtr()

    m2.resetPtr()


    fmt.Println("After resetPtr():", m1.X, m2.X)


    m1 = MyStruct{1}

    m2 = &MyStruct{1}


    m1.resetValue()

    m2.resetValue()


    fmt.Println("After resetValue():", m1.X, m2.X)

}

輸出


Original Values: 1 1

After resetPtr(): 0 0

After resetValue(): 1 1

您可以看到訪問這些變量的方式并不是真正的問題。它的更多內容是您可以在方法內部使用它們做什么,以及如何將它們作為參數傳遞給其他函數或方法(正在復制)。


查看完整回答
反對 回復 2021-05-10
?
婷婷同學_

TA貢獻1844條經驗 獲得超8個贊

簡短的解釋是,幕后的Go編譯器會自動轉換:

m1.reset()
m2.reset()

進入:

(&m1).reset()
m2.reset()


查看完整回答
反對 回復 2021-05-10
  • 3 回答
  • 0 關注
  • 264 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號