簡體   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