PHPer がはじめて Tour of Go を学んだときのポイント24選
Goって興味はあったけど全然触ってこなかったaomaです。
Goには A Tour of Go という、これをやればGoマスターになれるステキサイトがあります。
普段PHPに慣れている中で、ムムッ!?っとなった点を目次別にメモしました。
PHPerでこれからGoを学ぶよって人の助けになれば幸いです。
Packages, variables, and functions.
- 変数名の 後ろ に型名を書く
- 戻り値となる変数に名前をつけることができる
- 関数の中では、var 宣言の代わりに := の代入文で暗黙的な型宣言が可能
- 関数の外では、キーワードではじまる宣言( var, func, など)が必要
- 1 << 100
- (Go関係ないけど)<<はシフト(bitの移動)で乗のこと。1は2進数で表現されている。つまり2の2乗。
Flow control statements: for, if, else, switch and defer
- for、ifに括弧 ( ) は不要。中括弧 { } は必要
- for の初期化と後処理ステートメントの記述は任意
- whileはない。代わりにforを使う。セミコロン(;)の省略が可能
- if は、 for のように、条件の前に、評価するための簡単なステートメントを書くことが可能
- switch はbreakが不要
- https://go-tour-jp.appspot.com/flowcontrol/9
- 条件のないswitchは、 switch true と書くことと同じ
- caseに条件を書くことも可能
- defer ステートメントは、 defer へ渡した関数の実行を、呼び出し元の関数の終わり(returnする)まで遅延させる
defer へ渡した関数の引数は、すぐに評価される
https://go-tour-jp.appspot.com/flowcontrol/12
package main import "fmt" func main() { t := 1 defer fmt.Println(t) t++ fmt.Println(t) } // 2 // 1
defer が複数ある場合はLIFO(last-in-first-out) で呼び出される
More types: structs, slices, and maps.
ポインタ
&
オペレータで、その変数へのポインタを引き出す。p = &i
*
オペレータで、ポインタの指す先の変数を示す。*p(iのこと)
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)
- https://tour.golang.org/moretypes/19
- エクササイズ
- https://tour.golang.org/moretypes/23
- やった
- https://play.golang.org/p/kbXho4nncW7
- Goは変数使わないと怒られる。使わないものは_にすれば逃げれる
- The Go Playgroundでソースコードシェアできる
関数は関数の引数や戻り値としても使える
クロージャーは変数を保持する。戻り値が関数だとクロージャーと判断してよさそう。
- https://tour.golang.org/moretypes/25
- sum := 0 は一度しか呼ばれない
adder() func(int) int
の最後のint
はfunc(int)の戻り値ってこと。- https://play.golang.org/p/53ao0yB3GIS
Methods and interfaces
- 構造体にメソッド定義できる
- intなどの型にもメソッド定義できる。型をtypeで定義すれば。
- ポインタレシーバーで書き換えれる
ゴルーチン
- 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の誕生日ね!おめでとう!