読者です 読者をやめる 読者になる 読者になる

Kuchitama Tech Note

はてな記法がいつまでたっても覚えられないので、はてなダイアリーからマークダウンが使えるこっちに引っ越してきました。

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}

比較

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

すごくシンプルに並行プログラミングできる。 とりあえず、チャネルの動きだけ把握すれば良さそう。