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

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

Golang,帶有值接收器的函數的函數指針,在第二次調用時不會使用更改的接收器調用該函數

Golang,帶有值接收器的函數的函數指針,在第二次調用時不會使用更改的接收器調用該函數

Go
白板的微信 2022-05-23 17:15:28
package mainimport (    "fmt")type vector struct {    x int    y int}func (u vector) add(v vector) vector {    fmt.Println("received: ", u)    u.x += v.x    u.y += v.y    return u}func main() {    vecA := vector{x: 5, y: 10}    vecB := vector{x: 6, y: 7}    fp := vecA.add // 1    vecA = fp(vecB)   // 2    fmt.Println(vecA)    vecA = fp(vecB)   // 3    fmt.Println(vecA)}/*Output:received:  {5 10}{11 17}received:  {5 10}{11 17}*/在標記1fp處,我使用add函數聲明并初始化,vecA用作接收器。在標記2處,我更改了 的值vecA?,F在在3處,如果我們擴展語句:fp(vecA),它變成:vecA.add(vecB)。現在我認為它應該add使用“已更改” vecA(在標記2vecA處更改)調用函數,而不是(在標記1處更改)的舊值,而是add使用“舊” vecA(在標記1處)調用函數,這從輸出。為什么?雖然我找到了一種使用新的方法,vecA如下所示:package mainimport (    "fmt")type vector struct {    x int    y int}func (u *vector) add(v vector) {    fmt.Println("received: ", *u)    u.x += v.x    u.y += v.y}func main() {    vecA := &vector{x: 5, y: 10}    vecB := vector{x: 6, y: 7}    fp := vecA.add // 1    fp(vecB)   // 2    fmt.Println(*vecA)    fp(vecB)   // 3    fmt.Println(*vecA)}/*Output:received:  {5 10}{11 17}received:  {11 17}{17 24}*/
查看完整描述

2 回答

?
白豬掌柜的

TA貢獻1893條經驗 獲得超10個贊

現在我認為它應該使用“更改”的 vecA 調用 add 函數

不,這種想法是錯誤的。fp 是并且保持綁定到舊值。


查看完整回答
反對 回復 2022-05-23
?
largeQ

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

在您的第一個示例中, fp 使用 vecA 的值,因此 vecA 發生的任何事情都不會在初始分配后反映在 fp 中。

在您的第二個示例中, fp 使用 vecA 的地址?,F在您將內存位置中的 vecA 的值傳遞給 add func() 以便它使用更新的值。


查看完整回答
反對 回復 2022-05-23
  • 2 回答
  • 0 關注
  • 145 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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