首頁  >  文章  >  後端開發  >  附加到指標切片

附加到指標切片

WBOY
WBOY轉載
2024-02-06 10:00:071057瀏覽

附加到指標切片

問題內容

go 是我的第一種程式語言,我正在嘗試透過編寫一個根據分類法組織資訊的程式來學習指標。我在理解如何附加到指標切片時遇到一些困難。

type list struct {
    taxonomies []taxonomy
}

func (l *list) add(t taxonomy) {
    var exists bool
    var existing *taxonomy
    for _, taxonomy := range l.taxonomies {
        if taxonomy.name == t.name {
            exists = true
            existing = &taxonomy
        }
    }
    if exists {
        for _, term := range t.data {
            termexists := false
            for _, existingterm := range existing.data {
                if existingterm.name == term.name {
                    termexists = true
                    break
                }
            }
            if termexists {
                continue
            }
            (*existing).data = append((*existing).data, term)
        }
    } else {
        l.taxonomies = append(l.taxonomies, t)
    }
}

type taxonomy struct {
    name string
    data []term
}

type term struct {
    name, link string
}

我認為問題出在底部,這一行:

(*existing).Data = append((*existing).Data, term)

透過追蹤偵錯器中的程式碼,我可以看到當追加發生時,儲存在「現有」變數中的分類法正在更新,但實際清單中的資料並未更新。

誰能告訴我哪裡出錯了?


正確答案


l.taxonomies[]taxonomy,因此taxonomy 值將是該元素的副本,對該副本的變更不會反映在原始list 值中。

您可以使用索引進行迭代以避免複製值

for i := range l.taxonomies {
    if l.taxonomies[i].name == t.name {
        exists = true
        existing = &l.taxonomies[i]
    }
}

但是,仍然可以複製傳遞給 append 等方法的資料。相反,最好在整個過程中使用指標:

type List struct {
    Taxonomies []*Taxonomy
}

func (l *List) Add(t *Taxonomy) {
...

以上是附加到指標切片的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除