1. 導入:なぜポインタが必要なのか?
Go言語でプログラミングをしていると、関数の引数や構造体で「ポインタ」という言葉によく出会います。ポインタは一言で言えば「データの場所(メモリ上の住所)」を指し示すものです。
通常、変数に値を代入するとその値自体がコピーされますが、大きなデータや、関数の外側で値を変更したい場合、データそのものを複製するのは非効率です。ポインタを使えば、元のデータを直接操作できるため、メモリ効率が良くなり、プログラムの柔軟性が高まります。
2. 基礎知識:ポインタとは?
コンピュータのメモリには、一つひとつに「番地(アドレス)」が割り振られています。
ポインタ型は、この「番地」を保持するための特別な変数です。
ポインタに関連する2つの重要な演算子を覚えましょう。
・&演算子(アドレス演算子):変数の前に付けると、その変数が格納されているメモリ上の「番地」を取得できます。
・演算子(間接参照演算子):ポインタ変数の前に付けると、その番地が指し示している「中身の値」にアクセスできます。
3. 実装:ポインタ型の宣言方法
ポインタ型の変数を宣言するには、型名の前にアスタリスク()を付けます。例えば、整数型(int)のポインタを宣言する場合は「int」と記述します。これにより、その変数は「整数が保存されている場所の住所」を入れる箱として定義されます。
4. サンプルプログラム
以下のコードをコピーして、Goの環境で実行してみてください。ポインタを使って値を操作する仕組みが確認できます。
package main
import “fmt”
func main() {
// 通常の整数型変数
var num int = 100
// numの番地(ポインタ)をptrに格納
// int型は「int型の値がある場所」を指す型です
var ptr int = &num
fmt.Println(“元の値:”, num)
fmt.Println(“値の番地:”, ptr)
// ポインタ経由で値を書き換える
// ptrとすることで、その番地にある値そのものを操作します
ptr = 200
fmt.Println(“書き換え後の値:”, num)
}
5. 応用・注意点:現場で陥りやすい罠
実務でポインタを扱う際、最も注意すべきは「nilポインタ」です。
ポインタ変数を宣言した直後や、初期化せずにアクセスしようとすると、値が入っていない「nil」の状態となり、プログラムが実行時にクラッシュ(パニック)します。
注意点として、ポインタを使う際は、必ず値が代入されているか、あるいはnilチェック(if ptr != nil)を行う癖をつけましょう。
また、ポインタは「元のデータを書き換える」強力なツールですが、不用意に使いすぎると「どこで値が変更されたか」が追いにくくなります。基本的には、大きな構造体を扱う際や、関数で値の更新が必要な場面に限定して使用するのが、読みやすいコードを書くコツです。

コメント