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

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

為什么從非指針值調用的閉包不能正確添加到切片中?

為什么從非指針值調用的閉包不能正確添加到切片中?

Go
汪汪一只貓 2023-06-19 15:35:49
這是中的論點go1.12.3 linux/amd64。s通過變量向包含函數的切片添加了兩個閉包x。閉包是通過具有 類型的指針接收器的方法獲得的T。通過變量 x 向包含函數的切片 s 添加了兩個閉包。閉包是通過具有類型 T 的指針接收器的方法獲得的。package mainimport "fmt"type T struct {    X int}func (t *T) f() func() {    return func() { fmt.Println(t.X) }}func good() {    s := []func(){}    x := &T{1}    s = append(s, x.f())    x = &T{2}    s = append(s, x.f())    s[0]() // => 1    s[1]() // => 2}func bad() {    s := []func(){}    x := T{1}    s = append(s, (&x).f())  // Even if it rewrites to append(s, x.f()), the result is the same.    x = T{2}    s = append(s, (&x).f())    s[0]() // => 2 WHY!?    s[1]() // => 2}func main() {    good()    bad()}https://play.golang.org/p/j-818FZELQb以上兩個功能,good()按預期工作。在 good s[0]()executesT{1}.f()()和 s s[1]()executes中T{2}.f()()。但是,bad()運行s[0]()并s[1]()運行T{2}.f()()。即使我將元素添加到切片中而沒有覆蓋它!我不知道是什么導致了這種行為。變量x的值不是 typeT而不是指向 type 值的指針嗎T?還是不知道append的調用規范?請給我一些建議。
查看完整描述

1 回答

?
達令說

TA貢獻1821條經驗 獲得超6個贊

因為在糟糕的情況下,您只有一個x類型為 T 的變量,而一個變量只有一個地址,因此您的 slice s 始終包含在同一變量上工作的相同函數,當您開始調用函數時,該變量的值為 2。

(好吧,你有兩個不同的 T 類型變量。你重用了一個 *T 類型的變量 (x) 但你仍然有兩個不同的T 具有不同的值。)


查看完整回答
反對 回復 2023-06-19
  • 1 回答
  • 0 關注
  • 113 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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