Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

Avatar for ymmt2005 ymmt2005
August 20, 2013

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

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

Avatar for ymmt2005

ymmt2005

August 20, 2013
Tweet

More Decks by ymmt2005

Other Decks in Programming

Transcript

  1. Go はどんな言語?  Google による Go 言語の設計解説 ◦ http://talks.golang.org/2012/splash.article ◦

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

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

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

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

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

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

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