Go-pointers

提供:Dev Guides
移動先:案内検索

移動-ポインター

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

あなたはメモリアドレスとは何か、どのようにアクセスするかを理解しました。 次に、ポインターとは何かを見てみましょう。

ポインターとは

  • ポインタ*は、値が別の変数のアドレス、つまりメモリ位置の直接アドレスである変数です。 他の変数や定数と同様に、ポインターを使用して変数アドレスを保存する前に、ポインターを宣言する必要があります。 ポインタ変数宣言の一般的な形式は-
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のNilポインター

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プログラマーには明確なはずです-

Sr.No Concept & Description
1

Go - Array of pointers

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

2

Go - Pointer to pointer

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

3

Passing pointers to functions in Go

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