はじめに
Go言語のポインタの概念が分かりづらく、理解に時間を要しました。
初心者は、文章よりもコードを書いて動かしてみる方が理解が深まると思うので、本記事のコードを参考にしてください!
ポインタとは
ポインタは、ある値が格納されているメモリアドレスを保持する変数です。
ポインタを使用すると、直接そのメモリアドレスにアクセスして値を読み書きすることができます。
以下の演算子を使用して、ポインタを宣言します。
- &演算子:変数のメモリアドレスを取得します。
- *演算子:ポインタが指すメモリアドレスの値にアクセスします。
例:ポインタを使って値を変更する
package main
import "fmt"
func main() {
number := 10 // 整数変数の定義
fmt.Println("元の値:", number) // 元の値の出力
fmt.Println("numberのアドレス:", &number) // numberのメモリアドレスの出力
ptr := &number // numberのアドレスをptrに格納
*ptr = 20 // ptrが指すアドレスの値を20に変更
fmt.Println("ptrが指す値:", *ptr) // ptrが指す値の出力
fmt.Println("ptrの値(アドレス):", ptr) // ptrの値(実際はアドレス)の出力
fmt.Println("変更後の値:", number) // 変更後の値の出力
}
実行結果
このコードを実行すると、numberの値がポインタptrを通じて20に変更されます。
ポインタを使用することで、メモリアドレスを介して変数の値を直接操作できることがわかります。
元の値: 10
numberのアドレス: 0xc0000120b8
ptrが指す値: 20
ptrの値(アドレス): 0xc0000120b8
変更後の値: 20
例:ポインタを使う関数
ポインタを使用する関数は、引数や戻り値としてポインタを受け渡します。
以下の例では、整数のポインタを引数に取る関数を定義し、その値を変更します。
package main
import "fmt"
// incrementは、整数のポインタを受け取り、その値を1増やし、ポインタを返します。
func increment(number *int) *int {
fmt.Println("increment内のnumberのアドレス:", number) // increment関数内でのアドレスを表示
*number += 1
return number // 増加後の値のポインタを返す
}
func main() {
myNumber := 10
fmt.Println("元の値:", myNumber) // 元の値を表示
fmt.Println("main内のmyNumberのアドレス:", &myNumber) // myNumberのアドレスを表示
newPtr := increment(&myNumber) // 戻り値としてポインタを受け取る
fmt.Println("increment後の戻り値のアドレス:", newPtr) // 戻り値のポインタを表示
fmt.Println("increment後の戻り値の値:", *newPtr) // 戻り値のポインタが指す値を表示
fmt.Println("増加後:", myNumber) // 増加後の値を表示
}
実行結果
このコードを実行すると、increment関数がmyNumberの値を変更し、その新しい値(11)を返していることがわかります。
また、myNumberの値も同時に変更されていることが確認できます。
元の値: 10
main内のmyNumberのアドレス: 0xc0000120b8
increment内のnumberのアドレス: 0xc0000120b8
increment後の戻り値のアドレス: 0xc0000120b8
increment後の戻り値の値: 11
増加後: 11