Go 関数の戻り値は値を渡す方法を採用しています。つまり、関数内で戻り値を変更しても、呼び出し元のコードの値には影響しません。ただし、ポインタを渡すと、変数のメモリ アドレスを渡すことができるため、ポインタへの変更が呼び出し元のコードの元の変数に反映されます。この方法は、スライスなどの値のコレクションを変更する必要があるシナリオでよく使用されます。
Go 言語の関数の戻り値の転送方法
Go 言語では、関数の戻り値は通常、値の転送を使用します。方法。これは、関数内の戻り値に加えられた変更は、その関数を呼び出すコード内の値に影響を与えないことを意味します。
値の受け渡し
次の関数を考えてみましょう:
func increment(num int) { num = num + 1 } func main() { myNum := 5 increment(myNum) fmt.Println(myNum) // 输出:5 }
この関数では、num
を変更しても、変数値ですが、関数内でのみ有効です。関数は値によって渡されるため、main
関数の myNum
は 5 のままです。
参照渡し
変数への変更を関数呼び出しコードに渡す必要がある場合があります。このために、ポインターの受け渡しを使用できます。ポインタを渡すとき、実際には変数そのものではなく、変数のメモリ アドレスを渡します。
上記の例を変更してみましょう:
func increment(num *int) { *num = *num + 1 } func main() { myNum := 5 increment(&myNum) fmt.Println(myNum) // 输出:6 }
&myNum
を渡すことで、myNum
変数のアドレスを increment# に渡します。 # # 関数。これで、ポインターに加えられた変更は、関数呼び出しコードの元の変数に反映されます。
実践的なケース
スライスを変更する必要がある関数を考えてみましょう。スライスは値のコレクションであり、通常は値によって渡されます。関数内のスライスを変更したい場合は、ポインターを使用してスライスを渡す必要があります。func removeElement(s []int, idx int) { copy(s[idx:], s[idx+1:]) s[len(s)-1] = 0 s = s[:len(s)-1] } func main() { mySlice := []int{1, 2, 3, 4, 5} removeElement(&mySlice, 1) fmt.Println(mySlice) // 输出:[]1 3 4 5 }
removeElement 関数では、
&mySlice ポインタを渡して元のスライスを変更します。
以上がgolang関数の戻り値を渡す方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。