Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Goでこれどうやるの? 入門

1,145 views

Published on

Go初心者な自分がGo開発周りで、これはどうやるのか?を調べた結果を共有しています。

Published in: Technology
  • Be the first to comment

Goでこれどうやるの? 入門

  1. 1. Go でこれどうやるの? 入門 2017-10-17 @zaru
  2. 2. @zaru
  3. 3. 話したいこと REPL ブレークポイント パッケージ管理 Hot reload テストコード パッケージ・バイナリ配布gem
  4. 4. REPL Read-eval-print loop の略。Ruby だと irb や pry 、PHPだと psysh の こと。これがないと構文のチェックとか、これってどう動くのっていう 確認がやりにくい。 Go では gore がデファクトスタンダード(?) インストール go get -u github.com/motemen/gore # 以下はオプションだが、あったほうが良い go get -u github.com/nsf/gocode go get -u github.com/k0kubun/pp go get -u golang.org/x/tools/cmd/godoc
  5. 5. 必要なパッケージを勝手にimport してくれるオプションを付与して gore を起動。あとは自由にGoコードを書く。 gore -autoimport よく使うgore コマンド。 :doc <パッケージ名> 指定パッケージや関数のドキュメントが見られる autoimport にしている場合、一度実行しないと見られない :print gore で生成しているコードが見られる
  6. 6. ブレークポイント Ruby でブレークポイントというと binding.pry 。 Go のブレークポイン トは go-pry というライブラリがある。 インストール go get -u github.com/d4l3k/go-pry
  7. 7. 使い方 止めたい場所に pry.Pry() を仕込む。 package main import "github.com/d4l3k/go-pry/pry" func main() { a := 1 pry.Pry() } go run ではなく go-pry run で動かす。 go-pry run main.go
  8. 8. そうすると、止まってREPL チックにコードを実行できる。ただし、 Echo では動かない。フレームワークやコードによっては動かないので 注意。 Echo の場合は delve を使う。IntelliJ やVSCode は内部的にこれを利用 している模様。 IntelliJ のブレークポイントは変数の中身を見ることはできるが、 binding.pry のようにREPL チックに自由にコードを書いて実行するこ とはできない。 ちょっとしたコードや、CLIツール系なら go-pry でガッツリデバッグ。 日常的にはIntelliJ というノリ。
  9. 9. IntelliJ ブレークポイントビルド
  10. 10. パッケージ管理 Ruby だと bundler 。Go では dep 。 glide も有名だが、 dep が公式なの でこちらを利用していく。 go get -u github.com/golang/dep/cmd/dep
  11. 11. dep init パッケージはvendor ディレクトリ以下にダウンロードされる。 dep ensure Gopkg.lock にRevision などが記録される。 パッケージのアップデートはオプションコマンドで。 dep ensure -update dep ensure -update パッケージ名
  12. 12. なお、 dep などのバージョン管理ツールを利用しないと、バージョン 指定をしてライブラリを利用するということはできないので注意。 Go 的には常に最新のMaster を利用してくれよな! 公開パッケージを作 る人は常に後方互換性を保ってくれよな! というスタンスっぽい。 参考How should I manage package versions using "go get"?
  13. 13. ホットリロード Ruby では気にする必要はなかったが、都度ビルドする必要があるGo ではファイルウォッチャー的なツールが必要になる。個人的には realize が簡単で使いやすい。 go get -u github.com/tockins/realize realize run これだけ。
  14. 14. テスト テストはGo 標準でサポートしている。 ファイル名に _test.go を付ける 関数名は TextXxx でXxx は対象関数名 testing.T 構造体に含まれる関数を使う Error テストケース失敗、継続実行 Fatal テストケース失敗、終了 Log ログ出力 assert などは公式では用意されていない go test で実行
  15. 15. 印象は愚直。assert がないから温かみを感じる手書き感。しかしそれ が、逆に誰が見ても理解できるテストコードになるのかもしれない。冗 長な雰囲気あるけど、それはGo ならでは。 エラーメッセージは、何が落ちたか(What)というよりも、何で落ち たか(Why)を重視して書くのが良さげ。 参照Why does Go not have assertions?
  16. 16. サンプルテストコード package main import ( "testing" ) func TestSum(t *testing.T) { actual := Sum(10, 20) expected := 30 if actual != expected { t.Errorf("got %vnwant %v", actual, expected) } } 参照Go のTest に対する考え方
  17. 17. パッケージ・バイナリ配布 goreleaser を使うととても便利。 go get -u github.com/goreleaser/goreleaser
  18. 18. .goreleaser.yml builds: - binary: container-builder-local-api goos: - windows - darwin - linux goarch: - amd64 - 386 archive: format: zip name_template: "{{ .ProjectName }}_{{ .Os }}_{{ .Arch }}" files: - README.md release: github: owner: zaru name: container-builder-local-api
  19. 19. GitHub releases へ反映 GitHub releases にバイナリをアップロードするにはAPI TOKEN が必 要になる。Personal access token を発行する。 export GITHUB_TOKEN=`YOUR_TOKEN` git tag -a v0.1.0 git push origin v0.1.0 goreleaser

×