首頁  >  文章  >  後端開發  >  從切片建立類型

從切片建立類型

王林
王林轉載
2024-02-05 22:57:07712瀏覽

從切片建立類型

問題內容

我想建立一個像堆疊一樣的資料類型。我想在“頂部”中添加和刪除條目,並能夠將其列印出來。在此範例中,xpath 類型用於遍歷 xml 文件並追蹤當前路徑。

所以我建立了一個xpath[]string類型,並寫了對應的函數,即:push() pop()和string()。

我的問題是類型失去了狀態,這讓我有點困惑,因為我認為切片是引用類型。另外,如果我嘗試將函數更改為指標接收器,我會遇到幾個編譯錯誤。此時為了解決這個問題,我只是將 []string 更改為具有單一 []string 欄位的結構。儘管它仍然困擾著我,但我無法僅使用切片作為基礎類型來使其工作。

正確的做法是什麼?

package main

import (
    "fmt"
    "strings"
)

type xPath []string

func (xp xPath) push(entry string) {
    xp = append(xp, entry)
}

func (xp xPath) String() string {
    sb := strings.Builder{}
    sb.WriteString("/")
    sb.WriteString(strings.Join(xp, "/"))
    return sb.String()
}

func main() {
    xp := xPath{}
    xp.push("rss")
    xp.push("channel")
    xp.push("items")
    fmt.Println(xp)

    // Output: /
    // Wanted: /rss/channel/items
}

正確答案


您的推送功能沒有執行任何操作。

正確的推送功能:

func (xp *xPath) push(entry string) {
    *xp = append(*xp, entry)
}

在您想要變更其值(例如使用索引)的情況下,切片是參考類型。

另一方面,如果您想重新分配它們並替換整個切片,則應該使用指標。

關於堆疊,還有一些更好的方法: 看看這個問題

以上是從切片建立類型的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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