ポインタ

Go(Golang)における**ポインタ(pointer)**は、値のメモリアドレスを指し示す変数のことです。CやC++に似た概念ですが、Goではより安全で簡潔に使えるように設計されています。


1. ポインタの基本概念

Goでは、変数のアドレスを取得するには&演算子を使い、ポインタが指す値を参照するには*演算子を使います。

go
package main import "fmt" func main() { x := 10 p := &x // xのアドレスをpに代入(pはポインタ) fmt.Println(*p) // ポインタpが指す値(xの値)を出力 → 10 *p = 20 // xの値を20に変更 fmt.Println(x) // xの値を確認 → 20 }

2. ポインタの型

ポインタ型は、*Tの形式で表されます。これは「T型の値を指すポインタ」を意味します。

例:

  • *intint 型の値を指すポインタ

  • *stringstring 型の値を指すポインタ


3. ポインタと関数

Goでは関数にポインタを渡すことで、引数の元の値を変更することができます(Call by Reference)。

go
func modify(n *int) { *n = 100 } func main() { x := 5 modify(&x) fmt.Println(x) // 出力: 100 }

4. new関数によるポインタの生成

Goには組み込みのnew関数があり、指定した型のゼロ値を持つ変数をポインタとして生成します。

go
p := new(int) // *int型のポインタを生成(初期値は0) *p = 50 fmt.Println(*p) // 出力: 50

5. ポインタと構造体(struct)

ポインタは構造体と組み合わせて使われることが多く、メソッドのレシーバとしても頻繁に登場します。

go
type Person struct { name string } func (p *Person) setName(newName string) { p.name = newName } func main() { p := Person{name: "Taro"} p.setName("Jiro") fmt.Println(p.name) // 出力: Jiro }

6. Goにおけるポインタの制限

Goのポインタには以下のような制限があります:

  • ポインタ演算(p++など)は不可:C言語のようにポインタ同士の加減算はできません。

  • NULLの代わりにnil:ポインタの初期値や無効な状態をnilで表現します。

  • ポインタを使わなくても効率的な設計:多くの場合、Goでは値渡しでも十分効率が良いため、過剰なポインタの使用は推奨されません。


まとめ

操作 意味
&x 変数xのアドレスを取得
*p ポインタpが指す値を取得
*p = val ポインタpが指す値を更新
new(Type) ゼロ値を持つポインタを生成

Goのポインタは、値の共有、関数での副作用の実現、構造体のメソッドの最適化など、重要な場面で利用されます。

生成日:2025/05/03