圧倒亭グランパのブログ

30年後の自分にもわかるように書くブログ

A Tour of Go 完走 & VS Code デビュー

今更ながら完走しました。最近はcrystalばっかり触ってたので逆にいろいろ面白かったです。あと、現在vscodeに移行中なので、これもちょうど良い練習でした。エディタ移行に踏ん切りがつかない時、新言語の学習をセットで行ってしまう、というのは結構良いのでは?という知見が得られました。

リポジトリは下記です。Web上で完結させても良かったのですが、vscodeを使うことも一つの目的だったのでファイルとして残しました。

github.com

A Tour of Go 感想

vscode

A Tour of Go の感想と言いつつ、初っ端からエディタの話ですみません。

  • vscode-go 便利
    • 普段はあまりgoを書いていないので、良い感じの環境がなかった
    • vscodeの練習がてらに A Tour of Go って一石二鳥では
    • goの拡張機能をデフォルトで使ってみよう
    • と、とても良い…
      • snippet充実
      • 簡単デバッグ
      • コードジャンプ
      • リアルタイムformatter
      • 書いてるそばから型チェック
      • import自動挿入
      • etc…
    • 今まで某エディタで頑張っていたのは何だったんだ…
    • サクサク書けるし、サクサク実行できるし、サクサクpushできるし
    • 「書いていて楽しい」のは言語の影響もあるけど、エディタの影響もあるのでは
      • むしろ結構影響大きいのでは
    • 自動formatter、時々フォーマッティングのタイミングと入力のタイミングが重なって悲惨なことになるので、なんか調整必要かも
      • 慣れか?
      • できるだけデフォルト設定に身体を合わせていきたい派
  • vscodeのショートカットをどんどん覚えていくぞ
  • コマンドパレット便利だな
  • IDE派になりつつあるので IntelliJ IDEA も気になっている

A Tour of Go

  • packageってのをなんとなく理解できた
  • funcのsyntaxを理解できた
    • 型指定
    • 返り値指定
    • receiverの指定
  • pointer懐かしい
    • 学生時代にCを学んだ以来
    • 「きたかーw」という感じだったけど、書いているとそんなに複雑じゃない
  • sliceがなんとなくわかった
    • 最初は苦手意識があった
      • わけわかんなかった
    • とりあえず、「配列への範囲付き参照」という理解でいる
  • mapがわかった
    • crystalで言うHashだった
  • methodを理解できた
    • 「classがないからメソッドってどうするんだ?」という疑問があった
    • structを定義して、その型にメソッドを生やす
      • 「あーそういうことか、なるほど!」という感じ
    • 特に複雑なことじゃない
    • ポインタレシーバがわかった
      • 厳密に (&v).Scale(5) とかしなくて良いのは、最初戸惑ったけど書いているうちに慣れたし便利
  • interfaceを学べた
    • 自分の思っているインターフェースとは少し違った
      • イメージはphpのinterfaceだった
      • 結局は「メソッドの集まり」であり、それ以上でもそれ以下でもない
      • 「ある型の値が、interfaceの全メソッドを持つなら、interfaceを実装していることになる」
      • 明示的な指定がいらないのは戸惑ったけど、言われてみればそうだ
    • interfaceのメソッドを実装した「値」を、interface型の変数に持たせることができる
      • なるほど
      • 持たせる必要ある?
      • 持たせなくても良さそうな気もする
      • より厳密な型チェックと、明示的なinterfaceの実装を表現している?
    • まだちょっと使いこなせていない感
      • ダックタイピングのイメージはある
      • 概念はわかったが、どういう時にどう実装したらいいかがハッキリしていない
      • コード例を読みまくっていこう
  • Concurrencyは面白かった
    • crystalでspawnchannelという概念を勉強していたが、いまいちわかっていなかったので、goroutineを学べば何かヒントになるかも、という狙いもあった
    • goroutineシンプル
    • channelでのやりとりも直感的な気がする
    • まだconcurrencyのプログラミングには慣れていない
      • 度々、 fatal error: all goroutines are asleep - deadlock! に見舞われた
      • よくよく考えると「あー、goroutine動いていないのに値取ってきてたわー」となっている
        • 並行処理プログラミング、一気に複雑になるなーという印象
    • 非同期で実行されるgoroutineと、そのメッセージやりとりの為のchannel、その同期方法が大体わかったので、crystalのconcurrencyの理解にも繋がりそう
    • しかし、どういった場面に有効なのかがまだハッキリわからないので、コード読んでいくしかない

 

まとめ

総じて「golangはシンプル」という印象が強いです。周りの方が「読みやすい」というのもなんだか納得です。上記にあれこれ書いた通り、まだわかっていない部分もあるので、これからもっと触っていきたいですね。今後は、

  • 「みんなのGo言語」を読む
  • net/http触る
  • 何かライブラリ触ってみる
  • テスト方法を学ぶ

あたりをやっていこうかなと思います。

 

また、今回の取り組みで強烈に思ったことが二つあります。

  • エディタ環境を整えると、その言語が好きになりそう(個人の感想です)
    • というか、プログラミングがマジ面白くなる
    • もっと早く気づくべきだった
    • 言語の普及にはエディタ周り重要だ
  • 自分の好きな言語をより深く学ぶには、他の言語の学習は不可欠
    • crystalを知りたくてgoを学んだ、という側面もあった
    • crystal側の理解が進んだ場面もあった
    • 次はRust, Elixirあたりを触ってみようか

エディタの件はほんとに思いました。書いていて楽しいのです。

 

さて、まずは「みんなのGo言語」でも開こうかなと思います。