aoma blog

エンジニアの日常とか技術とか

PHPer がはじめて Tour of Go を学んだときのポイント24選

この記事は移転しました。約5秒後に新記事へ移動します。
移動しない場合はココをクリックして新サイトをお楽しみください。

Goって興味はあったけど全然触ってこなかったaomaです。

Goには A Tour of Go という、これをやればGoマスターになれるステキサイトがあります。

A Tour of Go

普段PHPに慣れている中で、ムムッ!?っとなった点を目次別にメモしました。
PHPerでこれからGoを学ぶよって人の助けになれば幸いです。

Packages, variables, and functions.

Flow control statements: for, if, else, switch and defer

More types: structs, slices, and maps.

  • ポインタ

  • structのフィールドはポインタで (*p).Xのようにアクセスできる。p.Xと省略することも可能

  • structのポインタpを出力すると&がついた形で返ってくる。(変数だと0x414020みたいなやつなのに...)
  • 配列は固定長。可変長はスライスをうまく使う

    • https://go-tour-jp.appspot.com/moretypes/7
    • コロンで指定した最初の要素は含むが、最後の要素は含まない。var s []int = primes[1:4]の場合、要素は3つ。
    • Sliceは配列のような感じ。要素をいじると元の配列や別のSliceの要素も変更される
    • 長さと容量。とっつきにくいが、長さはどこまで見せるか(カーテンどこまで開けるか)、容量は実際に持っている値たちと考えるとわかりやすい。
    • makeで様々な空のsliceを作れる
    • appendでsliceに追加できる。
      • https://go-tour-jp.appspot.com/moretypes/15
      • cap増え方の謎...
        • 調べた

          https://qiita.com/hitode7456/items/562527069e13347b89c8
          > 長さ が 容量 を超えた時に、その時の 容量 の倍の 容量 が新たに確保されることが分かりました。
          http://toc-dev.blogspot.com/2012/09/goslice-make.html
          > 2のn乗で徐々にメモリが拡張されているのがわかる。
          
        • ということで2の倍数で増えてく模様。(cap=3のときに溢れても6ではない)

          2個目の記事で、3 3 3 3 6 6 6 12 になっているところは、今実行すると、3 3 3 3 8 8 8 8 になった。
          
        • Goのバージョンによっても変わるらしい。気にしなくていいっぽい。

          https://stackoverflow.com/questions/38573983/capacity-of-slices-in-go
          > TL; DR - スライスの容量がどれだけ拡張されるかは仕様に記載されていません。Goのバージョンが異なれば(または実装が異なる場合も、アーキテクチャが異なる場合も同じバージョンなど)、スライスの容量は異なります。
          
  • Maps(辞書的なやつ。key/value

  • 関数は関数の引数や戻り値としても使える

  • クロージャーは変数を保持する。戻り値が関数だとクロージャーと判断してよさそう。

Methods and interfaces

ゴルーチン

  • http://cuto.unirita.co.jp/gostudy/post/goroutin/
    • 並列処理用。独立して動作する実行単位であり、OSが管理するスレッドに割り当てられて動作します。
    • 関数の呼び出し時に先頭に「go」を付けるだけ
    • 「ゴルーチン」として呼び出した関数の終了は待たないことです。そのため、呼び出した関数が返す戻り値を受け取ることはできません。
    • mainから開始している親となる処理が終了すれば、いくら他に「ゴルーチン」が動いていても、すべて中断して終了します。

おまけ

Note: Go playground上の時間は、いつも "2009-11-10 23:00:00 UTC" です。 この値の意味は、読者の楽しみのために残しておきます(^^)

一体どんな意味が!?と思い調べてみました。

Goは2009年11月に公に発表され[23]、バージョン1.0は2012年3月にリリースされました。 https://en.wikipedia.org/wiki/Go_(programming_language) https://opensource.googleblog.com/2009/11/hey-ho-lets-go.html

なるほどGoの誕生日ね!おめでとう!