radioc@?

レディオキャットハテナ

【勉強会メモ】Go言語開発の実際のところ

classmethod.connpass.com

日時:2017/08/18(金) 19:15 〜 21:00

場所:クラスメソッド株式会社大阪オフィス

はじめに

Go言語は個人的にここ1,2年で良い評判を聞く機会が増えてきている印象を持っていて最近勉強中です。と言ってもまともに何かを作ったことは無いのですが、今後に備えて勉強会に参加するなどして情報を集めて自分の中のモチベーションを維持しようとしております。

Go開発で実際にやった事一通り

サーバサイドのAPIをnodeからGoに置き換えた時の話。

  • goのバージョン管理ツール⇒使ってない
  • goのインストール
    • Homebrew
    • goenv
    • バイナリをDL⇒これを実施
  • プロダクトのソース⇒ $GOPATH の下
  • サブパッケージを指定する方法⇒ $GOPATH で絶対PATH指定
  • パッケージマネージャ⇒サードパーティglide を使用
  • 継承が使えないが大丈夫?⇒問題なし
    • メソッドのオーバーライド⇒構造体の埋め込みでできる
    • 抽象クラスの継承⇒関数を引数で渡す
  • パッケージ分け
    • 大きめにざっくり
    • Goでは循環参照がコンパイルエラーになる
  • 例外が使えないが大丈夫?
    • ほしい
    • なんとかなるがエラー処理が増える
      • goの panicrecover しないと goroutine を巻き込みプログラムをクラッシュさせる
      • 論理的なエラーでは使えない(log.Fatalでログ吐いたら落ちる)
  • Vendoring
    • vendor以下に依存パッケージを全て含めるとgitのdiffが大変なことになる
    • glideである程度バージョン管理
  • テスト
    • F/W⇒使ってない
    • 標準のtestingモジュールの単純な機能とassertionとしてのverfy
    • mock…関数の置き換えで実装
  • デプロイ
    • 設定ファイル⇒バイナリの中に含める
    • go-bindata ⇒リソースをバイナリ化
  • デプロイ⇒ECSを使う

goroutine パターン

goroutine の正しい実装について。言語仕様を理解して正しい実装をしましょうという話。

サンプルコードを実際に実行させてみながらの説明で分かりやすかった。

ただ、このテーマは見習い状態の自分が説明するよりもコードを見て理解してもらうのが一番なので詳細は自粛。

資料が公開されるようなのでそちらを参照。

説明資料は present というツールを使って作成されていて、プレゼン資料上でGoのサンプルコードを実行して結果を確認することもできて面白いツールだと思った。

godoc.org

PHPからGoフルスクラッチの戦後入社組から見た、Pairsの開発について。

  • PHPからGoへコード置き換え
  • WAF…RevelからGin
  • DB…MySQL⇒DynamoDB

技術スタック

  • Circus
  • xorm
  • logrus
  • glide

など

  • PHPから置き換えたGo⇒数十万行
  • エディタ⇒IntelijまたはVimVimのほうが多いらしい)
  • ブランチモデル⇒GitHub-Flow
    • masterがいつでもデプロイ可能な状態

フレームワークがGinである理由

  • Revelは多機能すぎた
  • 他のサービスではgojiを採用した事例あり
  • そもそもフレームワークはいらない論もある

vendoring

  • 外部ライブラリ依存はつらくなる
  • 小さいライブラリは取り込む必要ある
  • 標準ライブラリで良いか考えるほうがよい
  • 公式でdepがひっそり存在⇒まだ治安が悪い

Goバージョンアップ

  • 基本的にはコンパイルが通れば大丈夫
  • 1.5から1.6のMapの仕様変更でLogのライブラリが落ちる事例があった

config

メモリアロケーション問題

  • Goは速度的に有利なだけにパフォーマンス劣化が起きると辛い
    • pprof などのプロファイリングツールを使う
  • 正規表現が遅い⇒なんでも正規表現はよくない

感想

プログラミングを理解するには実際に触って動かしてみるのが一番とはいえ、実際に本格的に使った人の話を聞いて気づきを得ることもたくさんあります。 今回の勉強会は他の言語も経験したうえでGoの開発で実際にハマったこと、感じたこと、より高度な実装を行うために必要な知識など、他の言語を知っているエンジニアが本格的にGo言語を学ぼうとするうえで参考になる話が多かったのではないかと思います。

なお、発表資料などは改めてDevelopers.IOで公開されるとのこと。

dev.classmethod.jp

Twitterハッシュタグ #cm_osaka から参加者のコメントも確認できます。

twitter.com