Go-ポインタ

Goのポインタは簡単で楽しく学ぶことができます。一部のGoプログラミングタスクはポインターを使用するとより簡単に実行でき、参照による呼び出しなどの他のタスクはポインターを使用しないと実行できません。したがって、完璧なGoプログラマーになるには、ポインターを学ぶ必要があります。

ご存知のように、すべての変数はメモリ位置であり、すべてのメモリ位置にはアドレスが定義されており、アンパサンド(&)演算子を使用してアクセスできます。これはメモリ内のアドレスを示します。定義された変数のアドレスを出力する次の例を考えてみましょう-

package main

import "fmt"

func main() {
   var a int = 10   
   fmt.Printf("Address of a variable: %x\n", &a  )
}

上記のコードをコンパイルして実行すると、次の結果が得られます。

Address of a variable: 10328000

これで、メモリアドレスとは何かとそれにアクセスする方法を理解しました。それでは、ポインタとは何かを見てみましょう。

ポインタとは何ですか?

A pointerは、値が別の変数のアドレス、つまりメモリ位置の直接アドレスである変数です。他の変数や定数と同様に、変数アドレスを格納するために使用する前に、ポインターを宣言する必要があります。ポインタ変数宣言の一般的な形式は次のとおりです。

var var_name *var-type

ここに、 typeポインタの基本型です。有効なCデータ型である必要があり、var-nameポインタ変数の名前です。ポインタを宣言するために使用したアスタリスク*は、乗算に使用したものと同じアスタリスクです。ただし、このステートメントでは、変数をポインターとして指定するためにアスタリスクが使用されています。有効なポインタ宣言は次のとおりです-

var ip *int        /* pointer to an integer */
var fp *float32    /* pointer to a float */

整数、浮動小数点、その他を問わず、すべてのポインタの値の実際のデータ型は同じであり、メモリアドレスを表す長い16進数です。異なるデータ型のポインター間の唯一の違いは、ポインターが指す変数または定数のデータ型です。

ポインタの使い方は?

ポインターを使用して頻繁に実行する重要な操作がいくつかあります。(a)ポインター変数を定義し、(b)変数のアドレスをポインターに割り当て、(c)ポインター変数に格納されているアドレスの値にアクセスします。 。

これらの操作はすべて、オペランドで指定されたアドレスにある変数の値を返す単項演算子*を使用して実行されます。次の例は、これらの操作を実行する方法を示しています-

package main

import "fmt"

func main() {
   var a int = 20   /* actual variable declaration */
   var ip *int      /* pointer variable declaration */

   ip = &a  /* store address of a in pointer variable*/

   fmt.Printf("Address of a variable: %x\n", &a  )

   /* address stored in pointer variable */
   fmt.Printf("Address stored in ip variable: %x\n", ip )

   /* access the value using the pointer */
   fmt.Printf("Value of *ip variable: %d\n", *ip )
}

上記のコードをコンパイルして実行すると、次の結果が得られます。

Address of var variable: 10328000
Address stored in ip variable: 10328000
Value of *ip variable: 20

Goのゼロポインタ

割り当てる正確なアドレスがない場合に備えて、Goコンパイラはポインタ変数にNil値を割り当てます。これは、変数宣言時に行われます。nilが割り当てられたポインタは、nil ポインター。

nilポインターは、いくつかの標準ライブラリで定義されているゼロの値を持つ定数です。次のプログラムを検討してください-

package main

import "fmt"

func main() {
   var  ptr *int

   fmt.Printf("The value of ptr is : %x\n", ptr  )
}

上記のコードをコンパイルして実行すると、次の結果が得られます。

The value of ptr is 0

ほとんどのオペレーティングシステムでは、メモリがオペレーティングシステムによって予約されているため、プログラムはアドレス0のメモリにアクセスできません。ただし、メモリアドレス0には特別な意味があります。これは、ポインタがアクセス可能なメモリ位置を指すことを意図していないことを示します。ただし、慣例により、ポインターにnil(ゼロ)値が含まれている場合は、何も指していないと見なされます。

nilポインターをチェックするには、次のようにifステートメントを使用できます。

if(ptr != nil)     /* succeeds if p is not nil */
if(ptr == nil)    /* succeeds if p is null */

ポインタの詳細

ポインターには多くの簡単な概念があり、Goプログラミングにとって非常に重要です。以下のポインターの概念は、Goプログラマーにとって明確である必要があります-

シニア番号 コンセプトと説明
1 Go-ポインタの配列

多数のポインターを保持する配列を定義できます。

2 Go-ポインタへのポインタ

Goを使用すると、ポインタの上にポインタを置くことができます。

3 Goの関数へのポインタの受け渡し

参照またはアドレスの両方で引数を渡すと、渡された引数を、呼び出された関数によって呼び出し元の関数で変更できます。