Slide 1

Slide 1 text

実践的 Go 入門 サイボウズ株式会社 山本泰宇 @ymmt2005 2013-08-20

Slide 2

Slide 2 text

この資料について  Go 歴一週間未満の山本が実際のタスクを完了させる までに学んだりつっかかったりした点をまとめたものです  公式チュートリアルに書いてないことが中心です ◦ 公式なチュートリアルは各自読んでね  間違いやご意見があれば Twitter で!

Slide 3

Slide 3 text

Go はどんな言語?  Google による Go 言語の設計解説 ◦ http://talks.golang.org/2012/splash.article ◦ 興味深い内容なのでぜひ一読を  山本的解説 ◦ 「Innovative な言語」ではない  むしろ既存の仕組みをシンプルで実用的に仕立てた言語 ◦ 徹底して実用主義  C++より学習コストが低い ◦ 複雑な型システムを回避していることが主な理由  大抵の軽量言語より実行速度が速い  テスト・ドキュメンテーション・外部パッケージ・ビルドツール・コーディ ング規約など本気の開発で必要なものが揃ってる  得意分野は「非同期ネットワークサーバー」 ◦ CSP をベースにした concurrent な実行モデル

Slide 4

Slide 4 text

はじめにやること  まずは公式チュートリアルに目を通しましょう ◦ “How to Write Go Code”  コードやパッケージの配置方法、ユニットテストの書き方など ◦ “A Tour of Go”  Webでコードを動かしながら基礎を学べる ◦ “Effective Go”  命名規則や各種データ型やエラー処理を学べる  つぎに Go の処理系をインストールしましょう ◦ http://golang.org/doc/install  ここまでで約1日強くらいだと思います ◦ C/C++ や Java などの経験があれば

Slide 5

Slide 5 text

ここまでで学べること  開発全般 ◦ パッケージの管理, リモートパッケージ ◦ ユニットテストの書き方 ◦ doc comment の書き方 ◦ 命名規則, シンボルの export  Go の機能 ◦ 文法, 基本的な型 ◦ struct と メソッド, interface, type conversions ◦ defer, panic, recover ◦ go & channel, switch

Slide 6

Slide 6 text

仕事に使うにはまだ足りないこと  エディタや Git の設定  組み込み関数の一覧  良く使う機能の場所  実行ファイル用パッケージの書き方  一括インストール、一括テスト  複数 CPU で parallel 処理  ユニコード処理  error の楽な返し方  デバッグ  SQL データベースへの接続  などなど…

Slide 7

Slide 7 text

エディタの設定  インストールした go の misc ディレクトリを見てみよう  Emacser なら .emacs に以下のように書こう $ ls /usr/local/go/misc/ arm benchcmp dashboard fraise IntelliJIDEA pprof vim bash cgo dist git kate swig xcode bbedit chrome emacs goplay notepadplus tour zsh (if (file-exists-p "/usr/local/go/misc/emacs/go-mode-load.el") (progn (add-to-list 'load-path "/usr/local/go/misc/emacs/") (require 'go-mode-load) (add-hook 'go-mode-hook (lambda () (setq truncate-lines t) (setq tab-width 4)))))

Slide 8

Slide 8 text

Git の設定  Go は整形ツールも標準提供されてます  Git の pre-commit フックスクリプトが misc にあるの でコピーしましょう。整形済みかチェックしてくれます。 $ cd /usr/local/go/misc/git $ ls pre-commit $ cp pre-commit /path/to/your/.git/hooks/ $ go fmt cybozu/… (cybozu パッケージ全部を format) $ git status -s M src/cybozu/cydec/blob/blob.go M src/cybozu/cydec/blob/blob_test.go M src/cybozu/cydec/blob/example_test.go

Slide 9

Slide 9 text

組み込み関数の一覧  append とか copy がチュートリアルで出てきたけど、 組み込み関数の一覧はまだ見てませんよね?  以下が一覧です  仕様書はこちら: ◦ http://golang.org/ref/spec#Built-in_functions append cap close complex copy delete imag len make new panic print println real recover

Slide 10

Slide 10 text

良く使う機能の場所  特に良く使う機能の場所です パッケージ名 機能 fmt printf 系、fmt.Errorf io io.Copy や io.EOF など I/O 処理全般。 ことに io.EOF はストリーム終端で返ることが多いエラー なので必須の知識。 io/ioutil Discard (= /dev/null) や ReadDir, TempDir os ファイル操作全般 strconv 数値⇔文字列変換など strings 文字列処理 flag コマンドライン引数の処理 time 時間・日付系処理 log ログという名に隠れて exit や panic 系のユーティリ ティー関数があります

Slide 11

Slide 11 text

実行ファイル用パッケージの書き方  実行ファイル名はパッケージディレクトリ名になります  実行ファイルを作るパッケージのディレクトリには、main 以外のパッケージのファイルは置けません ◦ 上の例だと、main.go, process.go はどちらも main パッ ケージでないといけません $ ls -F src code.google.com/ cybozu/ exe/ github.com/ $ ls -F src/exe myserver/ myclient/ $ ls -F src/exe/myserver main.go process.go process_test.go $ go install exe/myserver $ ls -F bin myserver*

Slide 12

Slide 12 text

一括インストール、一括テスト  まとめてビルド・テスト・インストールしたいですよね ◦ “all” は全パッケージ ◦ “パッケージ名/…” はサブパッケージ全部 $ go test cybozu/… exe/… ok cybozu/cydec 0.007s ok exe/myserver 0.073s ok exe/myclient 0.007s $ go install exe/… $ ls bin myserver myclient

Slide 13

Slide 13 text

複数 CPU で parallel 処理  Go は concurrent な言語ですが、複数 CPU コアを 使って parallel 処理することもできます  やり方は環境変数 GOMAXPROCS を指定するだけ  スケールするのかとかフェアネスとかは知りません  $ GOMAXPROCS=8 ./bin/myserver

Slide 14

Slide 14 text

ユニコード処理  Go のソースコードは UTF-8 で書きます  Go の string も UTF-8 です ◦ バリデーション必須ではないので、不正なバイト列がありえます ◦ len(string) はバイト数を返します import ”unicode/utf8” // 末尾のユニコード文字を1文字削除 func trimLastRune(s string) string { if ! utf8.ValidString(s) { return s // invalid なので } u := []rune(s) // rune (int32) に変換 if len(u) == 0 { return s } return string(u[0:len(u)-1]) // len(u) はUnicode文字数 }

Slide 15

Slide 15 text

error の楽な返し方  Go は error インタフェースでエラーを返すのが標準  自前でエラーを返す楽な方法は? ◦ errors.New や fmt.Errorf を使いましょう import ( ”errors” ”fmt” ) func MyError() error { return errors.New(”My Error!”) } func MyError2(i int) error { return fmt.Errorf(”My Error code: %d”, i) }

Slide 16

Slide 16 text

デバッグ  printf デバッグもいいですが、GDB でもできます ◦ Debugging Go Code with GDB  時と場合によっては strace で追うのが楽なことも

Slide 17

Slide 17 text

SQL データベースへの接続  database/sql パッケージは JDBC のように抽象化さ れた SQL データベースへのアクセス方法を提供します ◦ ドライバ一覧  非公式チュートリアルですがいいのがあります ◦ “Go’s database/sql tutorial”  “go-sql-driver/mysql” ドライバは日付型の自動 マッピングをオプションで提供してます ◦ “time.Time support”

Slide 18

Slide 18 text

以上!