ポインタでのC / C ++とは異なり、ポインタのGo言語がシフトすることができないと、操作は安全なポインタです。
:ゴーあなたが3つのコンセプトを知っておく必要があり、ポインタの言語を理解したいポインタアドレス、ポインタ型、およびポインタ値を。
コンセプト
任意のプログラムデータがメモリにロードされた後、メモリがポインタである自分のアドレスを持っています。メモリに保存されたアドレスデータにするために、我々は、ポインタ変数が必要です。
たとえば、「人生は短いです、レッツ・ゴー」というフレーズ、私はそれがプログラムに書き込まれたく、プログラムは、(そのメモリアドレスは0x123456を仮定して)この文は、メモリにロードされる始め、私はこれらの言葉は、プログラムに割り当てられて置きます変数A
、変数に割り当てられたメモリアドレスB
。この時間変数はB
ポインタ変数です。変数によってA
変数B
この文で見つけることができます。
ゴー言語のポインタ演算が相殺することはできませんので、ポインタ操作のGo言語は非常に簡単で、我々は2つのだけのシンボルを覚えておく必要があります。
&
(アドレス)、及び*
(アドレス値)。
そして、ポインタ型ポインタアドレス
実行時に、各変数がアドレスを有し、アドレスがメモリ内の可変位置を表します。
ゴー言語の使用&
変数の前に置かれた文字変数を操作「フェッチアドレス」。
値型(整数、フロート、ブール、文字列 、アレイ、構造体)囲碁:言語のような、対応するポインタ型有し*int
、*int64
、*string
等が挙げられます。
変数ポインタの構文を取ります:
PTR:V =& // タイプTのV
- V:変数のアドレス、タイプの代表であると解釈されます
T
- PTR:変数のアドレスを受信し、それはPTR型で
*T
、ポインタ型Tが呼び出されます。*ポインタを表します。
例えば:
FUNCメイン(){ = 10 B =&A FMT。printf( ":%D PTR:%P \ n"は、&)// :10 PTR:0xc00001a078 FMT。printf( "B:%のp型:%T \ n"、B、B)// B:0xc00001a078タイプ:* INT fmt.Println(&B) // 0xc00000e018 }
で見てみましょうb := &a
イラスト:
ポインタ値
&演算子を使用した後、アドレスポインタは次のように、この変数は、次に、ポインタ、すなわちポインタ値*動作のために使用することができ、通常の変数のいずれかを取得する取ります。
メインFUNC(){ // ポインタ値 A = 10 、B =&:// へのポインタを保存第二変数A、Bのアドレス、 FMT。のprintf( "Bの種類:%T \ N-"、B) C:= B * // ポインタ値(メモリ・ポインタの値に応じて) FMT。のprintf( "Cの種類:%T \ N-"、C) FMT。のprintf( "のC値:V%\ N-"、C ) }
結果:
Bの種類:* int型の Cの種類:int型 cの値:10
要約:アドレス演算子&
と演算子値*
、相補オペレータのペアであり&
、フェッチアドレスを*
抽出されたアドレス値によって指されるアドレス。
- アドレス変数(&)操作に運ばポインタ変数にこの変数を得ることができます。
- ポインタ変数の値はポインタアドレスです。
- ポインタ変数の値(*)演算値は、元の変数をポイントへのポインタ変数を取得することができます
例えば値ポインタパス:
試験FUNC(A1 [3 ] INT){ A1 [ 0] = 100 } // ポインタのポインタ値受信 FUNCのTEST1(A1 * [3 ] INT){ 方法//のみポインタ型*値 A1 [ 0] = 100 } FUNCメイン(){ = [3] INT {1,2,3 } テスト() // 配列をコピーし、変数A1関数の名前空間に割り当て fmt.Println(A ) // [2. 3. 1] TEST1(&) // 形状TEST1関数パラメータを受信したポインタで、ポインタ通過する必要がある fmt.Println() //を有することにより、取得するためのポインタであるため、[100 2 3]アドレス }
新しい
関数ポインタの新しい種類、及びポインタの種類に対応するゼロ値の値を用いて得られます。
初期化タイプの新しいポインタ値を与えます
署名
FUNC 新しい(タイプ)*タイプ
- タイプはタイプである、新しい関数がパラメータを受け入れ、型を示します
- *タイプは、ポインタの型を示し、新しい機能は、メモリアドレス型へのポインタを返します。
メインFUNC(){ VARの A = 新たな新しい(INT) // int型のポインタを取得 fmt.Println(A) // 0xc000054058 * A = 10 // ポインタ代入 fmt.Println(A) // 0xc000054058 fmt.Println (* A) // 10 VAR C = 新しい新しい([3 ] INT) FMT .Println(C) // &[0 0 0] //(* C)[0] 10 = C [0] = 10 FMT。 println(* C) // [0 10 0] }
注: var a *int
ちょうど変数へのポインタを宣言したが初期化されていない、彼らはそれに割り当てることができる前に、ポインタ参照型を初期化する必要があるとして、メモリを持っています
メイク
これら三つのタイプがあるので、それが返すメモリの割り当て、新しい異なる、のみ使用スライス、マップやメモリちゃんが作成したために作る、と入力することは、むしろ彼らのポインタ型に比べ、3種類そのものであります参照型なので、彼らの手にまで戻る必要はありません。関数のシグネチャは、次のような機能を行います。
FUNCメイク(Tタイプ、サイズ... IntegerType)タイプ
メイク機能は、我々はあなたがそれらを操作する前に初期化するために行うために、スライス、マップ、チャネル、彼らの両方の必要性を使用し、かけがえのないです。私たちは前の章で説明してきたこれは、私たちは、以降の章では、チャネルについて詳細に説明します。
始まるこのセクションの例var b map[string]int
だけで変数bを宣言するには、型マップの変数であり、そして、キーと値のペアを割り当てることができますメイク使用初期化関数として次のサンプルコードのようなものが必要になります。
FUNCのmain(){ VAR Bマップ[ ストリング] int型 B =メイク(地図[ ストリング ] INT、10 ) B [ "熊二"] = 100 FMT。println(B) }
新規および違いを作ります
- 双方は、メモリ割り当てのために使用されます。
- 唯一のスライス、マップ、チャネル、または基準自体の三種類のリターンを初期化します。
- そして、メモリ割り当て、メモリのタイプとリターンポインタのゼロ値に対応する値の新しいタイプのためのポインタ型です。