一言で言えばポインタを移動します

ポインターはGoに固有のものではありませんが、Goには固有の種類のポインターがあるため、すべてのGoプログラムでポインターを使用するため、ポインターが固有である理由を理解することをお勧めします。

なぜポインタ?

Goのすべては、次のように値で渡されます。Cそして、Cから派生したすべての言語で。

Intを関数に渡すと、変数がコピーされます。

ポインタを渡すと、ポインタはコピーされますが、ないそれが指す値。

したがって、ほとんどの場合、ポインターは関数を呼び出し、参照によってパラメーターを渡すために使用されます。

簡単な変数を取りましょうx、値を持つ整数として定義されます5

x := 5

さて、のメモリアドレスxで取得できます&x

印刷する場合&xfmt.Println、あなたはそれが次のようなものであることがわかります0xc42000e248:メモリアドレス。

これで、この値を変数に割り当てることができ、その変数はへのポインタになりますx

y := &x

この代入文を書くと

*y = 10

インクルードx値は次のようになります10

ポインタ演算なし

GoポインターはCおよびC ++ポインターに似ていますが、次のような操作を実行できないため、より安全です。

var x *int;
x++;

ポインタのアドレスは変更できないため、ポインタ上で。ポインタ/配列の二重性はありません。

ローカル関数変数のポインタを返す

返されたポインターによって参照されるローカル関数変数は、ポインターが使用可能である間は引き続き使用可能です。これにより、ポインタが常にあなたの考えを指していることが保証されます。

ゼロポインタ

ポインタのゼロ値はnil。これは、nilポインターが引き続き可能であることを意味しますが、ポインターとしてマスクされる型が少なく、他のnilが配置されていないため、他の言語(C、Java、C ++)よりも問題が少なくなります。たとえば、Cの文字列はポインタです。 Goでは、それらはタイプです。

nil単一の戻り値言語のように、関数の一般的な戻り値ではありません—エラーチェックはより組織化されており、nil一般的なゼロ値ではありません。多くの組み込みデータ型(文字列、配列、マップ、スライスなど)には、とは異なるゼロ値があります。nil

参考文献


その他のチュートリアル: