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中文網其他相關文章!