値渡しと参照渡しの違い
Go言語では、関数の引数は値渡しとポインタ渡しで渡せます。値渡しは、引数の値を関数内の引数の値にコピーして渡す方法で、ポインタ渡しは、引数のアドレスを関数内の引数の値に渡す方法です。
値渡しでは、関数は引数の値をコピーして関数内部で演算するので、元の値には影響しません。つまり、関数内で引数の値を変更しても、関数外の変数は変化しません。
関数がポインタで渡される時、関数はパラメータのアドレスを関数のパラメータに渡され、関数内部はそのアドレスを通して元の値にアクセスしたり、変更したりします。これにより、大きなデータ構造をコピーせずに済むため、パフォーマンスが向上します。関数がポインタで参照する値に対する変更は、関数外部の変数に影響を与えます。
値渡しと参照渡しの違いを示すサンプルコードを次に示します。
package main
import "fmt"
func valuePass(num int) {
num = 10
}
func pointerPass(num *int) {
*num = 10
}
func main() {
num := 5
valuePass(num)
fmt.Println("Value Pass:", num) // 输出 5
pointerPass(&num)
fmt.Println("Pointer Pass:", num) // 输出 10
}
上記の例では、valuePass 関数は値渡しで、pointerPass 関数はポインタ渡しを使用しています。値渡しの valuePass 関数は num の値を変更できませんが、ポインタ渡しの pointerPass 関数は num の値を変更できます。