【勉強会メモ】Go言語開発の実際のところ
日時: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の
panic
はrecover
しないとgoroutine
を巻き込みプログラムをクラッシュさせる - 論理的なエラーでは使えない(log.Fatalでログ吐いたら落ちる)
- goの
- Vendoring
- vendor以下に依存パッケージを全て含めるとgitのdiffが大変なことになる
- glideである程度バージョン管理
- テスト
- F/W⇒使ってない
- 標準のtestingモジュールの単純な機能とassertionとしてのverfy
- mock…関数の置き換えで実装
- デプロイ
- 設定ファイル⇒バイナリの中に含める
- go-bindata ⇒リソースをバイナリ化
- デプロイ⇒ECSを使う
goroutine パターン
goroutine
の正しい実装について。言語仕様を理解して正しい実装をしましょうという話。
サンプルコードを実際に実行させてみながらの説明で分かりやすかった。
ただ、このテーマは見習い状態の自分が説明するよりもコードを見て理解してもらうのが一番なので詳細は自粛。
資料が公開されるようなのでそちらを参照。
説明資料は present
というツールを使って作成されていて、プレゼン資料上でGoのサンプルコードを実行して結果を確認することもできて面白いツールだと思った。
PHPからGoフルスクラッチの戦後入社組から見た、Pairsの開発について。
技術スタック
- Circus
- xorm
- logrus
- glide
など
フレームワークがGinである理由
- Revelは多機能すぎた
- 他のサービスではgojiを採用した事例あり
- そもそもフレームワークはいらない論もある
vendoring
- 外部ライブラリ依存はつらくなる
- 小さいライブラリは取り込む必要ある
- 標準ライブラリで良いか考えるほうがよい
- 公式でdepがひっそり存在⇒まだ治安が悪い
Goバージョンアップ
- 基本的にはコンパイルが通れば大丈夫
- 1.5から1.6のMapの仕様変更でLogのライブラリが落ちる事例があった
config
- godotenvを利用して環境変数から取得
メモリアロケーション問題
感想
プログラミングを理解するには実際に触って動かしてみるのが一番とはいえ、実際に本格的に使った人の話を聞いて気づきを得ることもたくさんあります。 今回の勉強会は他の言語も経験したうえでGoの開発で実際にハマったこと、感じたこと、より高度な実装を行うために必要な知識など、他の言語を知っているエンジニアが本格的にGo言語を学ぼうとするうえで参考になる話が多かったのではないかと思います。
なお、発表資料などは改めてDevelopers.IOで公開されるとのこと。