【Go言語学習|初心者向け】Go言語のポインタ入門:&演算子でメモリの場所をのぞいてみよう

1. 導入:なぜポインタが必要なのか

Go言語でプログラミングをしていると、関数の引数に大きなデータを渡したり、関数の中で値を書き換えたいという場面に出会います。そんな時に重要になるのが「ポインタ」です。ポインタを理解すると、メモリを効率的に使い、柔軟なプログラムを書くことができるようになります。今回は、ポインタの入り口である「&演算子」を使って、変数の住所を知る方法を学びましょう。

2. 基礎知識:メモリとアドレス

コンピュータのメモリ上には、変数の値が保存される「場所」があります。この場所を指し示す番地のようなものを「メモリアドレス」と呼びます。
&演算子は、変数の前に置くことで「その変数がメモリのどこに保存されているか」というアドレスを取得するための道具です。初心者の方は「変数の箱そのもの」ではなく「その箱が置いてある棚の番号」を取得するものだとイメージしてください。

3. 実装:&演算子の使い方

ポインタを扱う手順は非常にシンプルです。
1. 変数を宣言する。
2. 変数の前に & を付けて、アドレスを取得する。
3. 取得したアドレスを、ポインタ型(型名の前に を付けたもの)の変数に代入する。

これだけで、変数の住所を管理することが可能になります。

4. サンプルプログラム

以下のコードをコピーして、実際に実行してみてください。変数の値と、その変数が格納されているメモリのアドレスが表示されます。

package main

import "fmt"

func main() {
    // 通常の変数
    var score int = 100

    // &演算子を使って、score変数のアドレス(ポインタ)を取得
    // ptrの型は int (int型のポインタ型)になります
    ptr := &score

    // 変数の値を出力
    fmt.Printf("scoreの値: %d\n", score)

    // 変数のアドレスを出力(16進数で表示されます)
    fmt.Printf("scoreのアドレス: %p\n", ptr)

    // ポインタ経由で値を書き換えることも可能です(間接参照)
    ptr = 200
    fmt.Printf("書き換え後のscoreの値: %d\n", score)
}

5. 応用・注意点:現場で役立つポイント

実務でポインタを扱う際には、以下の点に注意してください。

nilのチェック:ポインタは、有効なアドレスを指していない「nil(空)」の状態になることがあります。nilの状態で中身を覗こうとするとプログラムが強制終了(パニック)するため、必ずnilチェックを行う癖をつけましょう。
使いすぎに注意:すべての変数をポインタにする必要はありません。小さな数値や構造体であれば、値をそのまま渡した方がメモリ管理やコードの可読性の面で安全な場合も多いです。
大きなデータの受け渡し:データ構造が非常に大きい場合、値をコピーして渡すとメモリを消費します。ポインタで渡すことで、コピーを避け高速に処理を行うことがGo言語の現場では一般的です。

まずは「&で住所が取れる」「で住所から中身が覗ける」という基本を、ぜひ試してみてください。

コメント

タイトルとURLをコピーしました