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

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

PHPz
發布: 2024-02-09 09:20:11
轉載
662 人瀏覽過

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

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
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板