ゆるふわ技術日誌

エンジニア見習いの悪戦苦闘日記

Goのポインタに対する自分なりの理解 #345

今日はライブに行ってきたので分量少なめですが、朝起きて勉強するのも悪くないですな。

Golang

他言語からきた人が一番ハマりそうなポインタ。案の定僕もハマったというか何を言ってるのか理解するのに時間を要してしまったので自分なりの理解を書いておく。(まだ学習途中なので、正確性に欠けるかもしれない。もう少しわかるようになったらQiitaとかに移植するのもありかもな)


前提

Goはポインタを使わない場合は全て値渡し

package main

import (
    "fmt"
)

// strの中身をHello worldに書き換える
func override(str string) string {
    str = "Hello world"
    return str
}

func main() {
    str := "Good morning!"
    fmt.Println(override(str))
    fmt.Println(str)
}

これを実行すると

Hello world
Good morning!

となる。(つまり元の変数が書き換わっていないことがわかる)

ポインタを使う

先ほどのmain.gooverrideをポインタを使った形に書き換えると以下のようになる。

package main

import (
    "fmt"
)

// strの中身をHello worldに書き換える
func override(str *string) string {
    *str = "Hello world"
    return *str
}

func main() {
    str := "Good morning!"
    fmt.Println(override(&str))
    fmt.Println(str)
}

これを実行すると

Hello world
Hello world

となり、mainで宣言されているstrの中身が書き換わっていることがわかる。(=参照渡し)

参照渡しする必要がある時に使うっていう認識で良いのだろう、多分。

ポインタの使い方

A Tour of Go

  • 変数Tのポインタは*T
  • &オペレーターはその変数へのポインタを引き出す
    • &iとするとiへのポインタを引き出すことができる
  • *オペレーターはポインタが指す先の変数を引き出すことができる

https://img.esa.io/uploads/production/attachments/8785/2018/04/30/27087/59cdbdd1-5eea-4c39-a5ef-faab22746518.png

なぜか最後だけ画像で手書きだけど気にしない。

分かってしまえばなんてことなくて、むしろ参照渡しなのか値渡しなのかを書いてて正確に把握できるのでいいのではないかと思った。

ちなみにレシーバーの指定もポインタを使うと参照渡しになる。

ライブ

技術全然関係ないけどライフログとして触れておく。

江戸川区の総合文化センターで行われたでんぱ組のライブに行ってきました。全国ツアーの東京公演って感じの位置付け。

今まで行ったライブは武道館→大阪城ホールと比較的大きい会場ばかりだったので、小さな会場で行われるライブは初めてでした。これはこれでよいものだなぁと思いました。(今回9列目の座席でしたが、普通にステージまで遮るものが何もなくて最高でした)

序盤のムーンライト伝説はアレンジ含めて最高だったのでどっかの円盤に収録してほしい…と行った気持ち。

最後にオタクピクチャーでも貼っておきます。

我ながら気持ち悪いな

雑談

研究室いくことを前提にペースを作ってたので連休なんか厳しいな。研究室行っちゃおうかしら。