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言語の現場では一般的です。
まずは「&で住所が取れる」「で住所から中身が覗ける」という基本を、ぜひ試してみてください。

コメント