Goの関数ポインタ

Musfirah Waseem 2023年6月20日
  1. Go でのポインターの宣言
  2. Go でポインターを初期化する
  3. Go で初期化されていないポインターを使用する
  4. Go でポインターに省略形の := 構文を使用する
  5. Go でポインターを使用して変数の値を変更する
  6. Go で new() 関数を使用してポインターを作成する
  7. Go の関数に引数としてポインターを渡す
  8. Go で変数のアドレスを引数として関数に渡す
  9. Go で関数からポインターを返す
Goの関数ポインタ

Go 言語のポインターは、他の変数のメモリ アドレスとメモリが配置されているポイントを格納するために使用される特殊な目的の変数です。 そのメモリ位置に保存されている値にもアクセスできます。

Go でのポインターの宣言

var pointer_name *Data_Type

関数ポインターで使用される演算子

  1. * - ポインター変数を宣言する逆参照演算子です。 逆参照されたアドレスに格納されている値は、それを使用してアクセスできます。
  2. & - 変数のアドレスを与えるために使用されるアドレス演算子です。

Go でポインターを初期化する

package main

import "fmt"

func main() {

	var myVariable int = 2

	var myPointer *int

	myPointer = &myVariable

	fmt.Println("The value stored in 'myVariable' = ", myVariable)

	fmt.Println("The address of 'myVariable' = ", &myVariable)

	fmt.Println("The value stored in 'myPointer' = ", myPointer)

	fmt.Println("The value pointed by 'myPointer' after dereferencing = ", *myPointer)
}

出力:

The value stored in 'myVariable' =  2
The address of 'myVariable' =  0xc000090020
The value stored in 'myPointer' =  0xc000090020.
The value pointed by 'myPointer' after dereferencing =  2

myPointer 変数に格納されている値は、変数 myVariable アドレスであることに注意してください。

Go で初期化されていないポインターを使用する

package main

import "fmt"

func main() {

	var myPointer *int

	fmt.Println("The value stored in 'myPointer' = ", myPointer)
}

出力:

The value stored in 'myPointer' =  <nil>

初期化されていないポインターには、デフォルトの nil 値があることに注意してください。

Go でポインターに省略形の := 構文を使用する

package main

import "fmt"

func main() {

	myVariable := 2

	myPointer := &myVariable

	fmt.Println("The value stored in 'myVariable' = ", myVariable)

	fmt.Println("The address of 'myVariable' = ", &myVariable)

	fmt.Println("The value stored in 'myPointer' = ", myPointer)

	fmt.Println("The value pointed by 'myPointer' after dereferencing = ", *myPointer)
}

出力:

The value stored in 'myVariable' =  2
The address of 'myVariable' =  0xc000090020
The value stored in 'myPointer' =  0xc000090020
The value pointed by 'myPointer' after dereferencing =  2

ポインター宣言でデータ型を指定した場合、ポインターを使用できるのは、その指定したデータ型変数のメモリ アドレスを処理するためだけであることに注意してください。

:= 演算子は自動的にデータ型を認識し、作成されたポインターが同じデータ型を処理できることを確認します。

Go でポインターを使用して変数の値を変更する

package main

import "fmt"

func main() {

	myVariable := 2

	myPointer := &myVariable

	fmt.Println("The value stored in 'myVariable' = ", myVariable)

	fmt.Println("The address of 'myVariable' = ", &myVariable)

	fmt.Println("The value stored in 'myPointer' = ", myPointer)

	fmt.Println("The value pointed by 'myPointer' after dereferencing = ", *myPointer)

	*myPointer = 5

	fmt.Println("The updated value pointed by 'myPointer' after dereferencing = ", *myPointer)

	fmt.Println("The updated value stored in 'myVariable' = ", myVariable)


}

出力:

The value stored in 'myVariable' =  2
The address of 'myVariable' =  0xc000016058
The value stored in 'myPointer' =  0xc000016058
The value pointed by 'myPointer' after dereferencing =  2
The updated value pointed by 'myPointer' after dereferencing =  5
The updated value stored in 'myVariable' =  5

変数に新しい値を割り当てる代わりに、ポインターの値を変更できることに注意してください。 ポインタで変更した値は元の値にも反映されます。

Go で new() 関数を使用してポインターを作成する

package main

import "fmt"

func main() {

	var myPointer = new(int)

	*myPointer = 2

	fmt.Println("The value stored in 'myPointer' = ", myPointer)

	fmt.Println("The value pointed by 'myPointer' after dereferencing = ", *myPointer)

}

出力:

The value stored in 'myPointer' =  0xc000016058
The value pointed by 'myPointer' after dereferencing =  2

new() 関数を使用すると、整数へのポインターを直接作成できることに注意してください。

Go の関数に引数としてポインターを渡す

package main

import "fmt"

func myFunction(myVariable *int) {

	*myVariable = 5
}

func main() {

	var myVariable = 2

	fmt.Printf("The value of myVariable before function call is: %d\n", myVariable)

	var myPointer *int = &myVariable

	myFunction(myPointer)

	fmt.Printf("The value of myVariable after function call is: %d\n", myVariable)

}

出力:

The value of myVariable before function call is: 2
The value of myVariable after function call is: 5

上記で作成した関数は、変数 myVariable の値を変更したことに注意してください。 ポインタは変数が格納されているメモリ位置を直接参照するため、関数内で変更された値は関数外に反映されます。

Go で変数のアドレスを引数として関数に渡す

package main

import "fmt"

func myFunction(myVariable *int) {

	*myVariable = 5
}

func main() {

	var myVariable = 2

	fmt.Printf("The value of myVariable before function call is: %d\n", myVariable)

	myFunction(&myVariable)

	fmt.Printf("The value of myVariable after function call is: %d\n", myVariable)

}

出力:

The value of myVariable before function call is: 2
The value of myVariable after function call is: 5

上記で作成した関数は、変数 myVariable の値を変更したことに注意してください。 関数内で変更された値は、関数外に反映されます。

変更は、変数が格納されているメモリ位置に行われます。 これは、ポインターを関数に渡すための代替方法です。

Go で関数からポインターを返す

package main
import "fmt"

func main() {

  displayText := display()

  fmt.Println("Hello,", *displayText)

}

func display() *string {

  myMessage := "World!"

  return &myMessage

}

出力:

Hello, World!

上記で作成した関数は、文字列 myMessage を指すポインターを返すことに注意してください。 次に、値は main 関数で逆参照されます。

著者: Musfirah Waseem
Musfirah Waseem avatar Musfirah Waseem avatar

Musfirah is a student of computer science from the best university in Pakistan. She has a knack for programming and everything related. She is a tech geek who loves to help people as much as possible.

LinkedIn