Menu
Coddy logo textTech

Goのポインタの基本

CoddyのGOジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 19/107。

A pointer は、別の variable の memory address を格納する variable です。値を直接保持する代わりに、その値が memory 内に存在する場所を保持します。Pointers は Go の基本であり、効率的なデータ操作に不可欠です。

ポインターを作成するには、& operator を使用して variable の address を取得し、* operator を使用してポインター型を宣言するか、その address にある値にアクセスします。

x := 42
p := &x  // p は x のメモリアドレスを保持する

fmt.Println(p)  // 0xc000018030 (メモリアドレス)
fmt.Println(*p) // 42 (そのアドレスの値)

& operator は「address of」を意味し、ポインターを返します。* operator は、ポインターに対して使用すると「value at」を意味し、デリファレンスと呼ばれます。ポインターを通じて original の値を modify することもできます。

x := 10
p := &x

*p = 25         // ポインタを通じて値を変更
fmt.Println(x)  // 25(元の変数が変更された)

ポインター型は、指し示される型が T の場合、*T と記述します。int へのポインターの型は *int です。

var p *int      // intへのポインタを宣言する
x := 100
p = &x          // pは現在xを指している

ポインターのゼロ値はnilであり、何も指していないことを意味します。nil ポインターを逆参照しようとすると実行時パニックが発生するため、使用する前に必ずポインターが初期化されていることを確認してください。

challenge icon

チャレンジ

簡単

memory addresses を通して variable を modify する pointers の力を示す、シンプルな value swapper を作成しましょう。

コードを two files に分けて整理します。

  • swap.go: two *int pointers をパラメーターとして takes する function SwapValues を作成します。この function は、これらの pointers が point する values を swap する必要があります。これを呼び出した after、各 variable はもう一方の original value を hold する必要があります。function は何も返しません。pointers を通して values を直接 modify します。
  • main.go: input から two integers を Read し、それらを variables に保存してから、SwapValues function を使用して values を交換します。change を示すために、swap の Before と After に both values を Print します。

次の input が提供されます。

  • Line 1: first integer
  • Line 2: second integer

Output format:

Before: a=[first] b=[second]
After: a=[first] b=[second]

たとえば、1025 が与えられた場合、output は次のようになります。

Before: a=10 b=25
After: a=25 b=10

variables を function に渡すときは & operator を使用し、function 内で actual values に access して modify するときは * operator を使用することを Remember してください。

自分で試してみよう

package main

import "fmt"

func main() {
	// 入力から2つの整数を読み取る
	var a, b int
	fmt.Scanln(&a)
	fmt.Scanln(&b)

	// スワップ前の値を出力する
	fmt.Printf("Before: a=%d b=%d\n", a, b)

	// TODO: a と b へのポインタを使って SwapValues 関数を呼び出す
	// アドレスを渡すために & 演算子を使うことを忘れないでください

	// スワップ後の値を出力する
	fmt.Printf("After: a=%d b=%d\n", a, b)
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

オブジェクト指向プログラミングのすべてのレッスン

自分で練習してみよう: Goオンラインコンパイラ