ScalaプログラマがA Tour of Goをやった
最近、転職した先で、やたらとGo言語を推してくる同僚がいるので、Scalaのポジションを守るためにも、一度Goを触ってみようと思ったので、その際のあれこれを書いきます。
やったこと
A Tour of Goを一通りやってみた。
A Tour of Goはポイントを抑えながらいろいろコードを試せるので、本当に最高ですね。 こういう、砂場環境はものごとの習得に大事!!
Scalaにもこういうの欲しい感があります。
やってみた雑感
- Webサービスに採用したいとは思わない(機能がシンプルなマイクロサービスなら可)
- サーバ内で動かすツール書くには良さそう
- インフラ寄りなことやるには良さそう
- ベターC とか Refine C という印象
気に入ったところ
- 静的型かつ、変数定義時に型宣言を省ける
- セミコロン(;)レス
- ループの構文が for のみ(whileとかない)
引っかかるところ
- 配列の宣言がなんかダサい。(超主観です)
[]int{...}
がなじまない。先頭に[] をつけるのはどういう意味があるんだろうか? - 継承の仕組みはなく、多態性を実現するために同じ処理を何度も書くことになりそう
- 十分にポインタはラップされているが、それでもポインタを意識から外せない
- mutable
- 配列/sliceもmutable
配列(array)とスライス(slice)
http://dibtp.hateblo.jp/entry/2014/07/06/190804
// 配列 p := [6]int{2, 3, 5, 7, 11, 13} q := [...]int{2, 3, 5, 7, 11, 13} // スライス r := []int{2, 3, 5, 7, 11, 13}
比較
- http://qiita.com/taksatou@github/items/48b22d6d37e99a6c21cc
- Slice同士の比較は出来ないけど、 Sliceとnilは比較できる
p := []int{1, 2} q := []int{1, 2} fmt.Println("p == nil", p == nil) //=> p == nil false fmt.Println("p == q", p == q) //=>(Error) invalid operation: p == q (slice can only be compared to nil)
forループ
ループはforのみ。 rangeで、indexと値を順に取り出せる(http://go-tour-jp.appspot.com/#34)
if
式ではない。ので、値を返せない(´・ω・`
switch
式ではない。 ので、こういうの↓書けない(´・ω・`
s := switch { case t.Hour() < 12: "Good morning!" case t.Hour() < 17: "Good afternoon." default: "Good evening." }
オブジェクト指向的な書き方
struct型にメソッドが適宜できる。(A Tour of Go #50)
構文として、struct型定義のスコープの外側でメソッドを定義するので、あまり好みではない。 コーディング規約として、struct型とメソッドは同じファイル内で定義するなどの、ルールで縛る必要がある。 メソッドを定義できるのはパッケージ内に限られて入るけど、それでも範囲が大きいように思う。
interface
明示的に継承などを宣言する必要がない。 ダックタイプ的な感じ。(というか、ダックタイプ?)
変数の型をinterfaceで指定すれば、適合するメソッドを持った値しか代入できなくなる。
// 鳥インタフェース type Bird interface { Sing() // 鳥は鳴く } // 鶏 構造体 type Rooster struct { sound string } func (r *Rooster) Sing() { fmt.Println(r.sound) // 鶏も鳴く } func main() { var b Bird b = &Rooster{"cock-a-doodle-doo"} // 鶏の鳴き声は、 "cock-a-doodle-doo" b.Sing() // あ、鳴いた => cock-a-doodle-doo }
Goroutine
すごくシンプルに並行プログラミングできる。 とりあえず、チャネルの動きだけ把握すれば良さそう。