A Tour of Goを終えたあなたにおすすめのGoを勉強するためのリソース
今年も夏のインターンで学生にGoの講義をします。多く寄せられる質問が「A Tour of Goを終えたのですが、その後に何をやるのがおすすめですか?」というものです。学生に限らず、言語を学ぶ方はプログラミングそのものに対する慣れやバックグラウンドも違います。そこでなるべくいろんな方の参考になるように、おすすめな本なりページなり方法なりをまとめてみます。
わりと多くの人におすすめ
「プログラミング言語Go」(Alan A.A. Donovan, Brian W. Kernighan著)です。通称GOPL。
柴田さんによる日本語翻訳もあります。
https://www.amazon.co.jp/dp/4621300253
Go言語のイントロダクションから始まり、型・インタフェース・並列性の説明などが丁寧にかかれています。私がGOPLを良いと思う点は、例示が豊富なところです。Goのインタフェースはとても強力ですが、最初その有用性をどのように活かせばいいかというのはちょっとした応用のコツを抑える必要があります。GOPLでは例を交えながら説明されているので、とてもわかりやすく、実践的です。例えば7.9では簡単な評価器をつくります。以下のような簡易電卓を実装します。
sqrt(A / pi) pow(x, 3) + pow(y, 3) (F - 32) * 5 / 9 (7.9 Example: Expression Evaluator より抜粋)
これらの式に対するパーサをどのように実装していくか、というのがわかりやすく説明されています。単項演算、二項演算の型を定義し、式をインタフェースとして定義します。
type Expr interface{ Eval(env Env) float64 }
この例では浮動小数点演算のみサポートしています。各演算はすべて Expr
のインタフェースを満たします。これにより、評価器の環境モデルをわかりやすく記述できるようにしています。
評価器の実装はインタフェースの演習の一例です。機能性を知り、理解を深めるために良い例だと私は思います。またGOPLでは、テストの実践例、豊富なGoのツールセット、Reflectionなどについても扱われており、私が知る中で日本語で読める書籍だと最も網羅的に書かれている本です。
もっと言語自体を深く知りたい方におすすめ
言語自体の理解を深めるには golang.org に載っているコンテンツを読み込むのがおすすめです。Goチームはドキュメントをとても重視していて、どの文章もよく書かれています。godocもその文化の一例です。
- 言語仕様: The Go Programming Language Specification - The Go Programming Language
- Effective Go: Effective Go - The Go Programming Language
- Goのメモリモデル: The Go Memory Model - The Go Programming Language
Goチームの書いているブログはどの記事も言語機能及び応用に関する解説として秀逸です。
The Go Programming Language Blog
ymotongpooさんが日本語訳を公開してくださっています。
個人的に好きな記事をあげておきます。
- Toward Go 2 - The Go Blog
- Error handling and Go - The Go Blog
- Arrays, slices (and strings): The mechanics of 'append' - The Go Blog
- Go Concurrency Patterns: Pipelines and cancellation - The Go Blog
- The Laws of Reflection - The Go Blog
- Errors are values - The Go Blog
- Go Slices: usage and internals - The Go Blog
また、Goの標準ライブラリを読み進めるのがおすすめです。言語仕様を読みつつ、「どう実装してるんだろう」と想像しながらコードを読み進めていくと楽しいです。Goの標準ライブラリはGoで書かれているので、読みやすいというのも嬉しいところです。
標準ライブラリを読むときはテストコードを読むとさらに理解が深まります。Goの標準ライブラリのテストコードは、そのライブラリをどのようにつかうかという視点でみたときによいサンプルになります。例えば、 encoding/json
を深く知りたいときには、
https://golang.org/src/encoding/json/encode.go を読みつつ
https://golang.org/src/encoding/json/encode_test.go を読むとわかりやすいです。 Examplesとして書かれたテスト はgodocにも載っているので、そちらも参考になります。
Webエンジニアで*1実践にGoを使ってみたいというあなたにおすすめ
Goの本ではないのですが、「Real World HTTP」(渋川よしき著)を個人的におすすめします。
内容紹介より引用します。
本書はHTTPに関する技術的な内容を一冊にまとめることを目的とした書籍です。HTTP/1.0、HTTP/1.1、HTTP/2と、HTTPが進化する道筋をたどりながら、ブラウザが内部で行っていること、サーバーとのやりとりの内容などについて、プロトコルの実例や実際の使用例などを交えながら紹介しています。 GoやJavaScriptによるコード例によって、単純なHTTPアクセス、フォームの送信、キャッシュやクッキーのコントロール、Keep-Alive、SSL/TLS、プロトコルアップグレード、サーバープッシュ、Server-Sent Events、WebSocketなどの動作を理解します。 これからウェブに関係する開発をする人や、これまで場当たり的に学んできた人にとって、幅広く複雑なHTTPとウェブ技術に関する知識を整理するのに役立ちます。HTTPでは日々新しいトピックが登場していますが、本書によって基礎をしっかりと押さえることは、さまざまな新しい技術をキャッチアップする一助にもなるでしょう。
夏のインターンでも学生向けにGoの話だけではなく、Webに関わるエンジニアとしてHTTPに関する講義を設けています。Real World HTTPはHTTPについて仕様を紹介するだけでなく、実際に動かす例を示しながら読み進めることのできる稀有な本です。また、HTTPの進化の過程を知ることもできますし、セキュリティに関わるトピックも丁寧に説明されています。Real World HTTPのコード例はサーバ実装、クライアント実装ともにGoが使われています。もちろん主眼はHTTPを学ぶことにありますが、GoでどのようにこのHTTPの機能を使うのか?というときに逆引きするのにも便利だと思います。
実践的なTipsをもっと知りたい方におすすめ
手前味噌ですが去年執筆に参加させていただいた「みんなのGo言語」、おすすめです。*2
そして何より
どんどん手を動かしてコードを書きましょう :)
思いつくまま挙げてみました。他にももしおすすめの本やリソースなどがあればコメントいただけると幸いです。
「みんなのGo言語」の執筆に参加しました
今回、「みんなのGo言語」の執筆に参加しました!
みんなのGo言語【現場で使える実践テクニック】 : 松木雅幸, mattn, 藤原俊一郎, 中島大一, 牧 大輔, 鈴木健太 : 本 : Amazon
私がGoでプログラムを書き始めたのは2015年の明けごろからです。mattnさんのブログ を読みながら、面白い言語があるのだなーと思って書き始めました。 A Tour of Go を触ってみて、ちょっと冗長そうだけど案外いい感じかもな?と思いつつ少しずつGoで実装するようになっていました。そこから標準ライブラリ読み漁り、小さなツールを書きつつ、気がついたらプロダクションでも使うようになっていました。今では毎日Goで何かを書いています。
これまでにつかった言語のなかで、いまのところGoがなぜかしっくりしてきています。一言でいうと「あーこういうのでいいんだよこういうので」感です。思えば、以下の機能がこの感覚の中心になっているように思います。
- 言語仕様が小さい
- gofmtがある
- コードレビューがしやすい
- 高速なビルド
Goでコードを書いていると、GoっぽくないGoのコードはよくないコードにみえてきます。これが言語設計のちからなのだな、というのを書いていて感じます。
「みんなのGo言語」はsongmu さん、mattn さん、fujiwara さん、deeeet さん、lestrrat さん、そして私の6人で書きました。個人的には執筆中も学びがあり、そして楽しく、書かせていただきました。みなさんありがとうございました!
私はテストの章を担当しました。 testing
パッケージの解説から、実際の現場でどのように testing
をつかってテストを書いているかという話を書きました。初めてGoの testing
パッケージをみたときには、「こんなシンプルなAPIでいいのかな?」と思ったのですが、使っていくうちにGoらしいテストライブラリであることがわかりました。Goの魅力の1つは標準ライブラリのシンプルなAPI設計です。テストライブラリとしての Less is exponentially more を感じていただけると幸いです。
「みんなのGo言語」、通称「みんGo」です。この本が少しでもみなさんの開発の助けになれば、嬉しく思います。
Shibuya.go#2 を開催しました
昨日 Shibuya.go#2 を開催しました!参加していただいたみなさま、どうもありがとうございました。
そして発表者のみなさま、発表どうもありがとうございました。リンクを貼っておきます。
テクニカルトーク
#shibuyago https://t.co/xi72fZ0x2y
— 地獄谷麻婆豆腐おじさん (@ajiyoshi) 2016年3月22日
LT
滑舌悪くて申し訳ないです。資料はこちらに挙げてあります〜 https://t.co/M7VGbDPx4J #shibuyago
— 常にOffline (@snowcrush) 2016年3月22日
今回も多くの方に集まっていただいて、色々と技術的な話含めて楽しめてよかったです。
- 仕事でGoを使われている方は3,4割程度といったところでした。
- 圧倒的Slackユーザ率
- Soralisユーザはお二人・・
懇親会ではMakefile便利だとかhostファイルの話をしたりとか最初から🍺を飲むと眠くなるというデメリットもある、という話をしたりしました。また次回、5月頃に開催予定ですので、お気軽に参加していただけると幸いです。
Shibuya.go#2を開催します!
Shibuya.goの2回目を開催します!
前回 Shibuya.go#1を開催しました。 - すずけんメモ に引き続き、弊社オフィスにて開催します!前回も盛りだくさんで、懇親会もだいぶ色々な話ができて楽しかったので今回もまた色々なお話ができれば嬉しいです。
Shibuya.go#1を開催しました。
今週の火曜日に Shibuya.go#1 - connpassを開催しました。ご来場していただいた皆様、発表者の皆様、どうもありがとうございました。
渋谷近辺、都内近郊でGoを書いている人ともっと会いたいなぁと思い、今回開催するにいたりました。私は普段から仕事でも仕事以外でもGoを使っているのですが、どうもあまりGoを書いている知り合いがあまりいないのでせっかくだし開催してみようと思ったのでした。人が集まるかなぁと思いつつ募集してみたら嬉しいことに多数の参加申し込みをいただき、抽選となってしまいました。参加できなかった方々申し訳ありません・・。
発表資料をまとめておきます。発表者のみなさま、どうもありがとうございました。
資料です https://t.co/8A2uJxbuUS #shibuyago
— suzuken (@suzu_v) 2016, 2月 16
資料です https://t.co/XjnhXvEH2g #shibuyago
— aihara (@shunsukeaihara) 2016, 2月 16
本日の発表資料です #shibuyago / “horenso ~ 報・連・相” https://t.co/PQGEYD94Ru
— songmu (@songmu) 2016, 2月 16
本日の発表資料です!Revelサイコー!! #shibuyago Go+Web App - Shibuya.go#1 https://t.co/HuY7Ippqal
— kaneshin@かねしん (@kaneshinth) 2016, 2月 16
https://t.co/f96RavAaD8 わたくしの先ほどのスライドを上げました #shibuyago
— トーカナイザの守護霊 (@mackee_w) 2016, 2月 16
#shibuyago で発表した資料です / “revealgo - Shibuya.go#1” https://t.co/yvhcv4PhMr
— Yusuke Wada (@yusukebe) 2016, 2月 16
発表した資料です https://t.co/H4uz3Lg0eZ #shibuyago
— Gosuke Miyashita (@gosukenator) 2016, 2月 16
また発表後も飲みつつ、色々なお話をすることができました。Goの集まりでしたがPerl感があったとの噂です。また来月も開催予定ですので、是非また参加していただけると幸いです!
その翌日(おとといですね)は Go 1.6 Release Party - connpass に行ってきました。主催者のみなさん、会場を用意してくださったはてなさん、どうもありがとうございました。こちらも楽しい会で、残念ながらGo 1.6はパーティー前にはリリースされなかったのですが、Gopherのみなさんとお話できて楽しかったです。 Go 1.6 is released - The Go Blog にもあるとおり、Go 1.6はリリースされました。私もさっそく今日一部のサーバにGo 1.6でビルドしたものをデプロイしました。
Travis CIを利用した継続的な成果物の配置
こんにちは。 @suzu_v です。 Advent Calendar 2015 18日目 休載のお知らせ - VOYAGE GROUP techlog とのことだったので代打で書いてみます。*1
いま私が所属している fluct ではCIの一部にTravis CIを利用しています。用途としては、
- 継続的なテスト
- 継続的なビルド
というところを担当しています。今日は簡単に、
の紹介をします。
Travis Artifacts
travis-ci/artifacts はTravis CIのアドオンとして利用されているもので、ビルド済みのartifactsを扱うことができます。私たちは一部のバッチやAPIサーバの実装について、Travis CIを利用したビルド及びs3への転送を行っています。
プロジェクト構成は概ね以下のようになっています。この場合Goのアプリです。
github.com/your-username/your-reponame .travis.yml Gomfile Gomfile.lock Makefile ci.mk cmd/myapp.go kuke.go kuke_test.go
.travis.yml
には以下のように設定しています。
sudo: false language: go go: - 1.5.2 before_script: - export PATH=$HOME/gopath/bin:$PATH install: make -f ci.mk deps script: - make -f ci.mk test - make -f ci.mk build addons: artifacts: paths: - $(git ls-files -o --exclude-standard | tr "\n" ":") debug: true bucket: your-bucket target-paths: artifacts/$TRAVIS_REPO_SLUG/$TRAVIS_BRANCH s3_region: "ap-northeast-1"
このようにすると s3://your-bucket/artifacts/your_user_name/your_repo_name/branch_name
以下にビルド物が展開されます。例えば github.com/suzuken/gs
のmasterブランチのビルドに対しては s3://your-bucket/artifacts/suzuken/gs/master
以下に成果物(artifacts)が配置されます。Pull Requestを出した場合にも同様で、トピックブランチごとのartifactがs3に配置されます。テストをするサーバ側ではこのartifactを aws s3 cp
などで取得し、利用することができます。ちなみにブランチ以外にもcommit hashやtagごとに出す、ということもできます。詳しくは travis-ci/artifacts をみてください。
git ls-files -o --exclude-standard | tr "\n" ":"
というのはざっくりいうと「git管理下では無いファイル」をリストする、ということをしています。こうすることでビルドされたものだけs3へのアップロード対象にすることができます。
ci.mk
というのはCI用のMakefileです。Makefile
は開発用に、 ci.mk
はCIで使うように、と分けています。実際にそれぞれやっていることはあまり変わりませんが、こうすることでプロジェクトごとのCI用のマクロを揃えておくということがやりやすくなります。例えばJavaのプロジェクトでもこの仕組をつかおうとしたときにでも、 make -f ci.mk install test build
すれば成果物ができる、という取り決めにしておけばよいのです。
実際に ci.mk
の中身は以下のようになっています。(プロジェクトによって若干異なりますが、Goのプロジェクトだと概ね以下のようになります。)
.PHONY: install build test deps BRANCH := master GOOS := linux GOARCH := amd64 deps: go get github.com/mattn/gom gom install test: gom test -v ./... build: myapp.$(GOOS).$(GOARCH).gz -rm myapp.$(GOOS).$(GOARCH) myapp.$(GOOS).$(GOARCH): GOOS=$(GOOS) GOARCH=$(GOARCH) gom build -ldflags "-X=main.version=$(shell git rev-parse HEAD)" cmd/myapp.go mv myapp $@ myapp.$(GOOS).$(GOARCH).gz: myapp.$(GOOS).$(GOARCH) gzip -f $< clean: -rm -rf myapp.$(GOOS).$(GOARCH) -rm -rf myapp.$(GOOS).$(GOARCH).gz
依存の管理には mattn/gom を利用しています。Go版のBundlerのようなものです。s3への転送は myapp.linux.arm64.gz
だけを配置する、ということにしたいので適当に整理しています。
Travis CIからS3への転送についてはcredentialが必要になります。これはTravis CIのプロジェクト設定で、環境変数から読み込ませることができます。 Uploading Artifacts on Travis CI - Travis CI に書いてあるとおり、リポジトリの設定から以下を設定します。
ARTIFACTS_KEY=(AWS access key id) ARTIFACTS_SECRET=(AWS secret access key) ARTIFACTS_BUCKET=(S3 bucket name)
Bucketについては .travis.yml
に設定してもよいでしょう。Travis CI側ではtestが通らないとbuildが実行されないようにしているので、これでビルドが通ったもののみs3に配置される、ということになります。
以上、簡単ですが代打でした。明日は @qooh0 さんです。
小ネタ
*1:決してTravis CIのビルドが詰まっているので息抜きに書いているわけではありません。 Travis CI Status - Start delays on legacy precise infrastructure for travis-ci.com (private) builds
vim-go-extraからvim-go に移った
ずっと vim-jp/vim-go-extra をつかっていたのだけど、oracleとかvetとかもろもろ扱いやすくしたいなと考えていたらもう fatih/vim-go でいいか、と考えてvim-goに移った。
前から dgryski/vim-godef を重宝していて、Godocをみるよりもソースに飛んでドキュメントとコード両方みる、みたいなことをしている。vim-goだとデフォルトの gd
の挙動がカレントバッファにジャンプ先を表示してしまって使いづらかったのでaliasを足しておいた。
nmap gs <Plug>(go-def-split)
ということで gs
で godef
をつかうようにした(sleepさんごめんなさい・・)。ちなみにsplitでみるのは私の癖で、実装元のコードと実装しているコードを並べて見ながら書く癖があるためである。並んで表示されていないと、すぐ忘れて行ったり来たり・・というのを繰り返してしまうのである。
vim-goにして3週間ほど経つけど問題ないので、ひとまず使い続ける予定。