在物件導向程式設計中,通常會使用getter方法來取得私有成員變數的值。然而,有時會有一個疑問:在從getter方法返回私有切片欄位之前,是否應該對它們使用複製?這個問題的答案並不是絕對的,要根據具體情況來決定。在某些情況下,對私有切片欄位進行複製可以防止外部程式碼對該欄位進行修改,從而保護資料的一致性和安全性。但是,在一些效能要求較高的場景中,複製操作可能會帶來額外的開銷,這時候可以考慮直接傳回切片欄位的參考。因此,需要根據具體情況來權衡利弊,選擇合適的方式來處理私有切片欄位的回傳。
如果 struct
有一個需要 getter 的私有切片字段,是否應該在返回切片之前複製該切片?
我想確認直接從 getter 傳回私有切片是否安全,因為我不希望呼叫者能夠透過 getter 的回傳值來修改它們。
從我到目前為止的測試來看,返回的切片似乎沒有連結到私有切片欄位。
但是,我不確定這是否適用於所有場景,如果不需要,我不想使用 copy
。
這是我嘗試過的:
package main import "fmt" type basket struct { fruits []string } func (b *basket) fruits() []string { return b.fruits } func (b *basket) addfruit(fruit string) { b.fruits = append(b.fruits, fruit) } func main() { basket := &basket{} basket.addfruit("apple") basket.addfruit("banana") basket.addfruit("orange") fruits := basket.fruits() fmt.println(fruits) // [apple banana orange] fruits = append(fruits, "mango") fruits = append(fruits, "lemon") fruits = append(fruits, "pineapple") fmt.println(fruits) // [apple banana orange mango lemon pineapple] fmt.println(basket.fruits()) // [apple banana orange] }
下面是 copy
的 getter 的樣子:
func (b *Basket) Fruits() []string { result := make([]string, len(b.fruits)) copy(result, b.fruits) return result }
正如 @kostix 在評論中提到的,這取決於場景。
對於OP中的那個,我們希望使用copy
,因為我們希望將Getter的輸出與私有欄位分開,這樣呼叫者就無法修改它。
以上是在從 getter 返回私有切片欄位之前,是否應該對它們使用複製?的詳細內容。更多資訊請關注PHP中文網其他相關文章!