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

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

ymmt2005
August 20, 2013

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

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

ymmt2005

August 20, 2013
Tweet

More Decks by ymmt2005

Other Decks in Programming

Transcript

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  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)))))

    View full-size slide

  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

    View full-size slide

  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

    View full-size slide

  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 系のユーティリ
    ティー関数があります

    View full-size slide

  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*

    View full-size slide

  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

    View full-size slide

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

    View full-size slide

  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文字数
    }

    View full-size slide

  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)
    }

    View full-size slide

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

    View full-size slide

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

    View full-size slide