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 ポインターを逆参照しようとすると実行時パニックが発生するため、使用する前に必ずポインターが初期化されていることを確認してください。
チャレンジ
簡単memory addresses を通して variable を modify する pointers の力を示す、シンプルな value swapper を作成しましょう。
コードを two files に分けて整理します。
swap.go: two*intpointers をパラメーターとして takes する functionSwapValuesを作成します。この function は、これらの pointers が point する values を swap する必要があります。これを呼び出した after、各 variable はもう一方の original value を hold する必要があります。function は何も返しません。pointers を通して values を直接 modify します。main.go: input から two integers を Read し、それらを variables に保存してから、SwapValuesfunction を使用して 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]たとえば、10 と 25 が与えられた場合、output は次のようになります。
Before: a=10 b=25
After: a=25 b=10variables を 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)
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
1Go オブジェクト指向の基礎
外部ファイルGo ワークスペースとモジュールパッケージとインポート公開された名前と非公開の名前Go におけるオブジェクト指向入門クラスとしての構造体構造体へのメソッド定義ポインタレシーバと値レシーバ構造体の初期化コンストラクタ関数まとめ:簡易計算機8エラー処理とOOP
error インターフェースカスタムエラー型エラーラッピング (fmt.Errorf)センチネルエラーerrors.Is() と errors.As()Panic、Defer、Recover復習 - ファイルパーサー自分で練習してみよう: Goオンラインコンパイラ