Pro Yearly is on sale from $80 to $50! »

Go のチュートリアルに足りないこと

Go のチュートリアルに足りないこと

Go のチュートリアルを読んだ後、実際の開発に入るために必要な情報をまとめた資料です。

Ae03eb47606f4e0125268d39f8aebfad?s=128

ymmt2005

August 20, 2013
Tweet

Transcript

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

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

    間違いやご意見があれば Twitter で!
  3. Go はどんな言語?  Google による Go 言語の設計解説 ◦ http://talks.golang.org/2012/splash.article ◦

    興味深い内容なのでぜひ一読を  山本的解説 ◦ 「Innovative な言語」ではない  むしろ既存の仕組みをシンプルで実用的に仕立てた言語 ◦ 徹底して実用主義  C++より学習コストが低い ◦ 複雑な型システムを回避していることが主な理由  大抵の軽量言語より実行速度が速い  テスト・ドキュメンテーション・外部パッケージ・ビルドツール・コーディ ング規約など本気の開発で必要なものが揃ってる  得意分野は「非同期ネットワークサーバー」 ◦ CSP をベースにした concurrent な実行モデル
  4. はじめにやること  まずは公式チュートリアルに目を通しましょう ◦ “How to Write Go Code” 

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

    comment の書き方 ◦ 命名規則, シンボルの export  Go の機能 ◦ 文法, 基本的な型 ◦ struct と メソッド, interface, type conversions ◦ defer, panic, recover ◦ go & channel, switch
  6. 仕事に使うにはまだ足りないこと  エディタや Git の設定  組み込み関数の一覧  良く使う機能の場所 

    実行ファイル用パッケージの書き方  一括インストール、一括テスト  複数 CPU で parallel 処理  ユニコード処理  error の楽な返し方  デバッグ  SQL データベースへの接続  などなど…
  7. エディタの設定  インストールした 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)))))
  8. 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
  9. 組み込み関数の一覧  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
  10. 良く使う機能の場所  特に良く使う機能の場所です パッケージ名 機能 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 系のユーティリ ティー関数があります
  11. 実行ファイル用パッケージの書き方  実行ファイル名はパッケージディレクトリ名になります  実行ファイルを作るパッケージのディレクトリには、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*
  12. 一括インストール、一括テスト  まとめてビルド・テスト・インストールしたいですよね ◦ “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
  13. 複数 CPU で parallel 処理  Go は concurrent な言語ですが、複数

    CPU コアを 使って parallel 処理することもできます  やり方は環境変数 GOMAXPROCS を指定するだけ  スケールするのかとかフェアネスとかは知りません  $ GOMAXPROCS=8 ./bin/myserver
  14. ユニコード処理  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文字数 }
  15. 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) }
  16. デバッグ  printf デバッグもいいですが、GDB でもできます ◦ Debugging Go Code with

    GDB  時と場合によっては strace で追うのが楽なことも
  17. SQL データベースへの接続  database/sql パッケージは JDBC のように抽象化さ れた SQL データベースへのアクセス方法を提供します

    ◦ ドライバ一覧  非公式チュートリアルですがいいのがあります ◦ “Go’s database/sql tutorial”  “go-sql-driver/mysql” ドライバは日付型の自動 マッピングをオプションで提供してます ◦ “time.Time support”
  18. 以上!