Go の例: ポインター

Go ではプログラム内の値とレコードへの参照を渡すことができるポインターがサポートされています。

package main
import "fmt"

ポインターが値とはどのように異なるか説明します。2 つの関数が使用されます: zerovalzeroptr です。zeroval には int パラメータがあり、引数は値によって渡されます。zeroval は呼び出し関数とは異なる ival のコピーを取得します。

func zeroval(ival int) {
    ival = 0
}

対照的に、zeroptr には *int パラメータがあり、つまり int ポインターを受け取ります。関数本体の *iptr コードはポインターをメモリアドレスからそのアドレスの現在の値に逆参照します。逆参照されたポインターに値を割り当てると、参照されたアドレスの値が変更されます。

func zeroptr(iptr *int) {
    *iptr = 0
}
func main() {
    i := 1
    fmt.Println("initial:", i)
    zeroval(i)
    fmt.Println("zeroval:", i)

&i 構文は i のメモリアドレス、つまり i へのポインターを渡します。

    zeroptr(&i)
    fmt.Println("zeroptr:", i)

ポインターも出力できます。

    fmt.Println("pointer:", &i)
}

zerovalmaini は変更しませんが、zeroptr はその変数のメモリアドレスへの参照があるため変更します。

$ go run pointers.go
initial: 1
zeroval: 1
zeroptr: 0
pointer: 0x42131100

次の例: 文字列とルーン