Go では、関数への引数の受け渡しは値によって行われます。つまり、引数に加えられた変更は値によって行われます。関数内の値は元の変数には反映されません。関数内でスライスに追加しても、関数の範囲を超えて元のスライスに影響を与えないため、スライスなどの可変データ型を操作する場合、これは問題になる可能性があります。
次の例を考えてみましょう:
nums := []int{1, 2, 3} func addToNumbs(nums []int) []int { nums = append(nums, 4) fmt.Println(nums) // []int{1, 2, 3, 4} } fmt.Println(nums) // []int{1, 2, 3}
この例では、AddToNumbs 関数は nums スライスのコピーを取得し、値 4 を追加します。これにより、内のコピーのみが変更されます。
この問題を解決するには、スライスを参照渡しする必要があります。これを行う 1 つの方法は、スライスへのポインターを渡すことです:
func myAppend(list *[]string, value string) { *list = append(*list, value) }
スライスへのポインタを渡すことにより、関数内で行われた変更は元のスライスに直接反映されます。ただし、ポインターを渡すということは、関数が予期しない方法でスライスを変更する可能性があることも意味するため、ポインターを慎重に使用することが重要です。
もう 1 つの方法は、例で示したように、関数から変更されたスライスを返すことです。次の例では:
func validate(obj Validatable, messages []ValidationMessage) []ValidationMessage { // Append to the accumulator and return it directly messages = append(messages, message) return messages }
この場合、検証関数は変更されたメッセージ スライスを返し、スライスへのポインタを渡す必要がなくなります。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3