Go言語入門 4回 (ポインター編)A Tour Of Go

GolangGo-lang

これまでのGolangに関する記事
Go言語入門 0回 (Golangの特徴)
Go言語環境構築メモ
Go言語入門 1回 (パッケージ編)A Tour Of Go
Go言語入門 2回 (関数,変数編)A Tour Of Go
Go言語入門 3回 (for文などの基本記述編)A Tour Of Go

ポインター

Goはポインターを扱うことができ、ポインターはあたいのメモリアドレスを指しています。
C言語とは異なり、ポインタ演算はありません。

package main

import "fmt"

func main() {
    i, j := 42, 2701

    p := &i         // point to i
    fmt.Println(*p) // read i through the pointer
    *p = 21         // set i through the pointer
    fmt.Println(i)  // see the new value of i

    p = &j         // point to j
    *p = *p / 37   // divide j through the pointer
    fmt.Println(j) // see the new value of j
}

実行結果は

42
21
73

となります。p := &i の部分でiという変数が持つアドレスをpに格納しています。
*pがpが持つアドレスに存在する値を参照するという意味を表しているので、iの値を間接的に出力していることになります。*p = 21 の行では,pが持つアドレスの値を変更しているので、pが持つアドレスはiを参照していることになるので、iの値を21に置き換えていることになります。iの値を出力すると、21になります。p = *p / 37 の行では、pに変数jのアドレスを格納しているので、*pは2701になります。2701を37で割った値を格納しているので、jの値が書き換わり73となります。

struct

structのフィールドは、ドット( . )を用いてアクセスします。

package main

import "fmt"

type Vertex struct {
    X int
    Y int
}

func main() {
    v := Vertex{1, 2}
    v.X = 4
    fmt.Println(v.X)
}

Vertex という構造体を宣言しています。v := Vertex{1,2}の行で、X,Yの値をそれぞれ1,2とした変数vとしています。次の行で、vのXの値を1から4に変更しています。出力結果は4になります。

package main

import "fmt"

type Vertex struct {
    X int
    Y int
}

func main() {
    v := Vertex{1, 2}
    p := &v
    p.X = 1e9
    fmt.Println(v)
}

アドレスを使った記述もすることができ、pという変数にvのアドレスを持たせているので、間接的にvのXを1e9に書き換えています。出力結果は{1000000000 2}になります。