はじめに
A Tour of Goのポインタで理解に時間がかかったのでイラストやを使って解説してみました。
メモリアドレスといった難しいワードを使わないようにしているので比較的わかりやすいかなと思っております。
今回の実装コード
以下のコードを解説していきます。
16進数の値は状況に応じて変わる可能性があります。
darts.go
package main
import "fmt"
func main() {
blueArrow, redArrow := 42, 2701
blueArrowMap := &blueArrow
// blueArrow: 42
fmt.Println("blueArrow:", blueArrow)
// &blueArrow: 0xc000104040
fmt.Println("&blueArrow:", &blueArrow)
// redArrow: 2701
fmt.Println("redArrow:", redArrow)
// &redArrow: 0xc000104048
fmt.Println("&redArrow:", &redArrow)
// blueArrowMap: xc000104040
fmt.Println("blueArrowMap:", blueArrowMap)
// &blueArrowMap: 0xc000108038
fmt.Println("&blueArrowMap:", &blueArrowMap)
// *blueArrowMap: 42
fmt.Println("*blueArrowMap:", *blueArrowMap)
*blueArrowMap = 21
// blueArrow: 21
fmt.Println("blueArrow:", blueArrow)
// &blueArrow: 0xc000104040
fmt.Println("&blueArrow:", &blueArrow)
blueArrowMap = &redArrow
// blueArrowMap: 0xc000104048
fmt.Println("blueArrowMap:", blueArrowMap)
// &blueArrowMap: 0xc000108038
fmt.Println("&blueArrowMap:", &blueArrowMap)
// *blueArrowMap: 2701
fmt.Println("*blueArrowMap:", *blueArrowMap)
}
ステップ1:ダーツを投げる
1行目でダーツを投げました。
どちらのダーツの矢も値(ここではダーツの名前だと思ってください)を定義しただけなので位置は適当に決められます。
blueArrow, redArrow := 42, 2701
ステップ2:青いダーツの地図を書く
2行目で青い矢の位置を定義する変数を宣言します
blueArrowMap := &blueArrow
ステップ3:矢の情報を確認
&をつけることを場所を定義することができます
// blueArrow: 42
fmt.Println("blueArrow:", blueArrow)
// &をつけると場所が定義される。今回は場所を定義していないので適当な16進数が定義される
// &blueArrow: 0xc000104040
fmt.Println("&blueArrow:", &blueArrow)
// redArrow: 2701
fmt.Println("redArrow:", redArrow)
// &をつけると場所が定義される。今回は場所を定義していないので適当な16進数が定義される
// &redArrow: 0xc000104048
fmt.Println("&redArrow:", &redArrow)
ステップ4:青いダーツの地図の情報を確認
東京都にあるのは適当に決めました
// blueArrowMap自体は住所が定義されているので16進数が表示
// blueArrowMap: 0xc000104040
fmt.Println("blueArrowMap:", blueArrowMap)
// &をつけると場所が定義される。この地図自体の住所が定義されるので上記とは別になる
// &blueArrowMap: 0xc000108038
fmt.Println("&blueArrowMap:", &blueArrowMap)
// *をつけるとそこに刺さっているダーツのvalue(今回でいう名前)が表示
// *blueArrowMap: 42
fmt.Println("*blueArrowMap:", *blueArrowMap)
ステップ5:青いダーツの名前を変更
*blueArrowMap = 21
ステップ6:命名変更された青いダーツの情報を確認
// value(今回でいう青いダーツ名)は変えられてしまった
// blueArrow: 21
fmt.Println("blueArrow:", blueArrow)
// 青いダーツの住所は変わっていないので引き続き同じ場所に刺さっている
// &blueArrow: 0xc000104040
fmt.Println("&blueArrow:", &blueArrow)
ステップ7:地図の対象を赤い矢に変更
blueArrowMap = &redArrow
ステップ8:対象が変わった赤いダーツの情報を確認
// 地図に書かれているのは赤い矢の住所に変更
// blueArrowMap: 0xc000104048
fmt.Println("blueArrowMap:", blueArrowMap)
// 地図の住所自体は変わらない
// &blueArrowMap: 0xc000108038
fmt.Println("&blueArrowMap:", &blueArrowMap)
// 赤いダーツのvalue(今回でいう名前)が表示
// *blueArrowMap: 2701
fmt.Println("*blueArrowMap:", *blueArrowMap)
終わりに
ポインタを住所を使って示すことでわかりやすくなったかなと思います。
この記事がポインタとメモリの操作が少しでも参考になれば幸いです。
最後までお読みいただきありがとうございます!