Go における値とポインターのセマンティクス
値のセマンティクスとは、変数の値のコピーを関数またはメソッドに渡すことを指します。元の値に影響を与えずにこのコピーのみを変更する関数。
ポインター セマンティクス。 hand を使用すると、関数がポインタを渡すことによって元の値を変更できるようになります。 Go はすべてを値で渡しますが、一部の型はポインター セマンティクスを示します。
例: 値セマンティクス
次の例を考えてみましょう:
func main() { i := 1 fmt.Println("double:", double(i)) fmt.Println("original i:", i) } func double(i int) int { i *= 2 return i }
ここi を double に渡すとコピーが作成され、double を変更しても元の i には影響しません。 variable.
例: ポインター セマンティクス
ポインター セマンティクスを示すために、スライスを使用してみましょう:
func main() { is := []int{1, 2} fmt.Println("double:", doubles(is)) fmt.Println("original is:", is) } func doubles(is []int) []int { for i := range is { is[i] *= 2 } return is }
この場合、渡すのは次のとおりです。 doubles はスライス ヘッダーのコピーを作成しますが、基になる配列へのポインターは変わりません。したがって、double 内の要素への変更は、元のスライスに反映されます。
Reasoning
Go では、すべてが値によって渡されますが、スライスは、配列へのポインタを含む構造体。スライスが渡されると、スライス ヘッダーのコピーに同じポインターが含まれ、関数が元の配列要素を変更できるようになります。この動作はポインター セマンティクスとして知られています。
結論
Go では、値とポインター セマンティクスを理解することが重要です。関数が元の値を変更できるか、コピーのみを変更できるかを決定します。
以上がGo の値とポインターのセマンティクス: 関数が元の変数を変更するのはいつですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。