元のスライスを変更してスライスを引数として渡す
Go で変数を値で渡すと、関数変更の影響が関数のスコープに制限されます。スライスを関数の外部で変更する必要がある場合、スライスを引数として直接渡すだけでは不十分です。
スライス追加関数の動作
追加関数は、新しいスライスを作成し、関数内で行われた追加を含む要素を既存のスライスからコピーします。ただし、元のスライスは影響を受けません。
例: 蓄積スライスでの再帰
提供されたコード スニペットは、最初に、引数として渡されたスライスに検証メッセージを蓄積しようとします。再帰関数に。ただし、関数の変更は元のスライスには反映されません。
解決策
この問題には主に 2 つの解決策があります。
func myAppend(list *[]string, value string) { *list = append(*list, value) }
func validate(obj Validatable, messages []ValidationMessage) []ValidationMessage { //...Processing return messages }
慣用的な Go アプローチ
関数が元のスライスを変更する必要がある場合、スライスにポインターを渡すことは慣用的な Go アプローチです。スライスを返すアプローチで実証されているように、変更されたスライスを返すことによってアキュムレータの必要性を回避することも可能です。
パフォーマンスに関する考慮事項
パラメータを渡すことによるパフォーマンスへの影響ポインタとスライスを返すことは、ほとんどのシナリオでは無視できます。ただし、正確な動作はコンパイラの最適化や特定のコードの使用状況によって異なる場合があります。
以上がGo 関数の引数として渡されたスライスを変更するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。