ホームページ >バックエンド開発 >Golang >ゲッターからプライベート スライス フィールドを返す前に、プライベート スライス フィールドでコピーを使用する必要がありますか?

ゲッターからプライベート スライス フィールドを返す前に、プライベート スライス フィールドでコピーを使用する必要がありますか?

WBOY
WBOY転載
2024-02-09 16:30:10764ブラウズ

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

オブジェクト指向プログラミングでは、通常、プライベート メンバー変数の値を取得するためにゲッター メソッドが使用されます。ただし、時々疑問が生じることがあります。ゲッター メソッドからプライベート スライス フィールドを返す前に、プライベート スライス フィールドのコピーを使用する必要があるでしょうか。この質問に対する答えは絶対的なものではなく、特定の状況によって異なります。場合によっては、プライベート スライス フィールドをコピーすると、外部コードによるフィールドの変更が防止され、データの一貫性とセキュリティが保護されます。ただし、高いパフォーマンス要件が必要な一部のシナリオでは、コピー操作により追加のオーバーヘッドが発生する可能性があるため、この場合は、スライス フィールドへの参照を直接返すことを検討できます。したがって、特定の状況に基づいてメリットとデメリットを比較検討し、プライベート スライス フィールドの返還を処理する適切な方法を選択する必要があります。

質問内容

structにゲッターを必要とするプライベートスライスフィールドがある場合、スライスを返す前にスライスをコピーする必要がありますか?

プライベート スライスをゲッターから直接返すことが安全かどうかを確認したいと思います。呼び出し元がゲッターの戻り値を介してプライベート スライスを変更できるようにしたくないからです。

これまでのテストによると、返されたスライスはプライベート スライス フィールドにリンクされていないようです。 ただし、これがすべてのシナリオで機能するかどうかはわかりません。必要がない場合は copy を使用したくありません。

これが私が試したことです:

リーリー

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]
}

回避策

@kostixがコメントで述べたように、それはシナリオによって異なります。

OP の場合、呼び出し元が変更できないようにゲッターの出力をプライベート フィールドから分離したいため、copy を使用します。

以上がゲッターからプライベート スライス フィールドを返す前に、プライベート スライス フィールドでコピーを使用する必要がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。