首頁 >後端開發 >Golang >如何以不變性公開切片成員?

如何以不變性公開切片成員?

PHPz
PHPz轉載
2024-02-09 09:20:11663瀏覽

如何以不變性公開切片成員?

php小編蘋果將為大家介紹如何以不變性公開切片成員。在程式設計中,切片是指從一個陣列或字串中截取一部分元素或字元的操作。通常情況下,切片操作會傳回一個新的陣列或字串,但有時我們希望保持原始陣列或字串不變,並且僅僅公開切片的部分成員。這樣做可以提高程式的效能和記憶體利用率。接下來,我們將詳細介紹如何實現這項操作。

問題內容

我有一個帶有切片成員的結構,以及一個公開該切片的方法。但我不希望呼叫者能夠更改切片的內容。如果我這樣做:

type a struct {
    slice []int
}

func (a *a) list() []int {
    return a.slice
}

它不安全,因為內容很容易被修改:

a := a{[]int{1, 2, 3}}
_ = append(a.list()[:2], 4)
fmt.println(a.list()) // [1 2 4]

顯然我可以讓 list() 傳回切片的副本以避免這種情況:

func (a *A) list() []int {
    return append([]int{}, a.slice...)
}
但這意味著每次當我只想迭代切片時我都會創建一個副本,這似乎很浪費。有沒有辦法做到這一點而無需不必要的複製?

解決方法

一旦您透過傳回該切片將其提供給外部呼叫者,就可以對其進行修改。如果出於效能原因不接受複製,您可以實現訪客:

func (a *a) visit(f func(int)) {
    for _, v := range a.slice {
        f(v)
    }
}

這根本不會公開切片,並且允許客戶端程式碼一次查看切片中的所有項目。如果這些項目不是指標或其他可變類型,則這實際上是唯讀的,因為訪客回呼將收到該值的副本。

如果您想提前停止迭代,訪客可以傳回一個布林值(可選)。

func (a *A) Visit(f func(int) bool) {
    for _, v := range a.slice {
        if !f(v) {
            return
        }
    }
}

以上是如何以不變性公開切片成員?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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