エディタの設定
インストールした 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
実行ファイル用パッケージの書き方
実行ファイル名はパッケージディレクトリ名になります
実行ファイルを作るパッケージのディレクトリには、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文字数
}