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