ホームページ > バックエンド開発 > Golang > Go 関数の引数として渡されたスライスを変更するにはどうすればよいですか?

Go 関数の引数として渡されたスライスを変更するにはどうすればよいですか?

Barbara Streisand
リリース: 2024-12-23 07:30:43
オリジナル
985 人が閲覧しました

How Can I Modify a Slice Passed as an Argument in a Go Function?

元のスライスを変更してスライスを引数として渡す

Go で変数を値で渡すと、関数変更の影響が関数のスコープに制限されます。スライスを関数の外部で変更する必要がある場合、スライスを引数として直接渡すだけでは不十分です。

スライス追加関数の動作

追加関数は、新しいスライスを作成し、関数内で行われた追加を含む要素を既存のスライスからコピーします。ただし、元のスライスは影響を受けません。

例: 蓄積スライスでの再帰

提供されたコード スニペットは、最初に、引数として渡されたスライスに検証メッセージを蓄積しようとします。再帰関数に。ただし、関数の変更は元のスライスには反映されません。

解決策

この問題には主に 2 つの解決策があります。

  1. スライスへのポインタを渡す: 元のスライスへのポインタを渡すことにより、変更が行われます。関数内で作成されたものは、オリジナルに直接影響します。
func myAppend(list *[]string, value string) {
    *list = append(*list, value)
}
ログイン後にコピー
  1. 関数から変更されたスライスを返す: アキュムレータを渡す代わりに、再帰関数は返すことができます。変更されたスライス。アキュムレータを渡す必要がなくなります。 variable.
func validate(obj Validatable, messages []ValidationMessage) []ValidationMessage {
    //...Processing

    return messages
}
ログイン後にコピー

慣用的な Go アプローチ

関数が元のスライスを変更する必要がある場合、スライスにポインターを渡すことは慣用的な Go アプローチです。スライスを返すアプローチで実証されているように、変更されたスライスを返すことによってアキュムレータの必要性を回避することも可能です。

パフォーマンスに関する考慮事項

パラメータを渡すことによるパフォーマンスへの影響ポインタとスライスを返すことは、ほとんどのシナリオでは無視できます。ただし、正確な動作はコンパイラの最適化や特定のコードの使用状況によって異なる場合があります。

以上がGo 関数の引数として渡されたスライスを変更するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート