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

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

DDD
DDDオリジナル
2024-12-27 05:10:14546ブラウズ

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

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

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 を追加します。これにより、関数内のコピーのみが変更され、元の nums スライスは関数の外では変更されません。

この問題を解決するには、スライスを参照渡しする必要があります。これを行う 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
}

この場合、validate 関数は変更されたメッセージ スライスを返し、スライスへのポインタを渡す必要がなくなります。

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。