這是中的論點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 具有不同的值。)
- 1 回答
- 0 關注
- 113 瀏覽
添加回答
舉報
0/150
提交
取消