[英]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.