繁体   English   中英

结构片 vs 结构指针片

[英]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 供您测试:

https://play.golang.org/p/YE-cokyEHu

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM