Blogブログ

システム

go言語

2020.07.02

Go言語入門の入門「ポインタ」でつまずくことなかれ。

前回までのあらすじ

前回はvagrant/centos7にgo入れて変数にぶち込んでPrintするだけということをやりました。

今日はポインタをやっていきます。

まず、型宣言しなくても
test := 5 とかで勝手にint型を空気読んで設定してくれるということは前回やりました。

ここで、プログラムの世界では、
この変数のメモリ的な住所(アドレス)に値(今回は5)が入ってることになります。

この時、
そのアドレスや値にアクセスする方法としてポインタというものを使います。

まず、
ポインタを扱う変数をpoiaとして、intの型のアドレスを格納すると決めたとすると
書き方は

var poia *int

ってなります。

そして、先ほどのtest := 5で格納されたtestについて、
アドレスと値をそれぞれ適応してみましょう。

poia = &test

このように&と先ほど決めた変数名で、その変数のアドレスを取得できます。
&XXでint型のアドレスを取得するために *int で宣言したという形です。

つまり、
例えば、
yama := “山本”
という変数を文字列で宣言していたとして、
この変数のstringのアドレスと値を取りたいなと思ったら、
var poib *string で定義しておき、

poib = &yama でアドレスを取得。
*poib でその値(山本)を取得できるということになります。

まとめるとこんなコードになります。

package main
import "fmt"

func main() {
    var number int
    //どの演算子もjsやphpやruby等とほとんど変わらんですね。
    number =( 1 + 1 * 2 / 3 ) * 3 % 3
    fmt.Println(number)

    //ポインタ(変数のメモリのアドレス)の宣言
    test := 5
    yama := "山本"
    var poia *int
      // 「*型」と書くことで、ポインタを宣言している。
    var poib *string

    poia = &test
    poib = &yama
      //&をつけるとtestの変数のアドレスが格納される
      //ちなみに*poia と書くと、test変数の値、つまり5のこととなる。

    fmt.Println(poia)
    fmt.Println(*poia)

    fmt.Println(poib)
    fmt.Println(*poib)

}
~       

index2.goで保存し実行するとこんな感じになります。

[vagrant@localhost ~]$ go run index2.go
0
0xc000016090
5
0xc000010200
山本

使い所としては、大きなarrayとかを値渡しする時に、
コピーするとコストがかかるので、
変数として渡した先で変更を加えたい時

一言で便利さをいうなら

アドレスを格納したポインタ変数Xに対して,
*Xのように書くと、
そのXが保持しているアドレスのデータを表示できるのですよ。

なので配列とかオブジェクトとかの中に向かって指定するのではなくて、
とりあえずポインタ型で指定されてるならアスタつければデータにアクセスできます。