[英]Slice of structs vs a slice of pointers to structs
我不明白以下代碼的行為。 在創建匹配結構列表作為結構指針切片時,代碼總是打印原始數組的最后一個元素(實際上不是匹配)——它打印 12 和 12。但是,如果我將匹配項更改為 [] Widget 而不是 []*Widget,那么它將打印 10 和 11。
這是為什么?
package main
import (
"fmt"
)
func main() {
type Widget struct {
id int
attrs []string
}
widgets := []Widget{
Widget{
id: 10,
attrs: []string{"blah", "foo"},
},
Widget{
id: 11,
attrs: []string{"foo", "bar"},
},
Widget{
id: 12,
attrs: []string{"xyz"},
},
}
var matches []*Widget
for _, w := range widgets {
for _, a := range w.attrs {
if a == "foo" {
matches = append(matches, &w)
break
}
}
}
for _, m := range matches {
fmt.Println(m.id)
}
}
那是因為當您使用指針時,您將&w
添加到數組中。
請注意, w
實際上是循環中使用的局部變量,因此這不是您要添加到matches
數組的地址。
(即使變量w
的值在循環中發生變化,其地址保持不變)
當循環結束時, w
以最后一個值結束,這就是它兩次打印12
的原因。
您需要添加匹配的元素的地址。
如果你這樣做:
matches = append(matches, &widgets[i])
然后它也可以與指針一起工作。
修改后的 Go playground 供您測試:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.