首頁 > 後端開發 > Golang > 主體

在從 getter 返回私有切片欄位之前,是否應該對它們使用複製?

WBOY
發布: 2024-02-09 16:30:10
轉載
731 人瀏覽過

在从 getter 返回私有切片字段之前,是否应该对它们使用复制?

在物件導向程式設計中,通常會使用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中文網其他相關文章!

來源:stackoverflow.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!