Road to Gopher
Gopherを名乗る上で必須と思われる基礎的・汎用的なトピックを扱う。
あるいは用途別逆引き見出しリスト。
前提:
- 言語仕様の内容を把握していること
例外処理
入門ガイド:
関連項目:
参考:
- Go言語のエラーハンドリングについて - Qiita
- Golangのエラーハンドリングの基本 - Qiita
- Defer, Panic, and Recover - The Go Blog
- panicはともかくrecoverに使いどころはほとんどない - Qiita
- golangでrecoverしたときの戻り値 - PartyIX
- Golangでエラー時にスタックトレースを表示する - Qiita
テスト
See テスト
コマンドライン
関連項目:
参考:
コマンド引数
入門サンプル:
関連項目:
参考:
外部コマンド実行
関連項目:
ファイル操作
関連項目:
参考:
ディレクトリ操作
参考:
実行可能ファイルを判定
Examples:
func isExecutableFile(f os.FileInfo) {
return !f.IsDir() && f.Mode()&0111 != 0
}
参考:
シンボリックリンクを判別
いくつか使える関数があるが、どれも一発で行かなくて少しだけ面倒くさい。
Example:
if link, err := os.Readlink(path); link != "" {
fmt.Printf("[Symlink] %s -> %s")
} else {
fmt.Printf("[Not Symlink] %s")
}
他に使えそうな関数:
- os.Lstat
- filepath.EvalSymlinks
参考:
ライブラリ管理
Go 1.14からGo Modulesが標準機能になったので、これを使いましょう。
ドキュメント:
関連項目:
参考:
ビルド
関連項目:
モジュール作成
上のライブラリ管理で述べたGo Moduleの仕組みを使う。
モジュール更新
新しいバージョンを公開する場合、pkg.go.devにすぐに反映されないことがある。
その場合、以下いずれかの操作を行う:
- proxy.golang.org に当該バージョンのモジュールをリクエストする
- 例) https://proxy.golang.org/example.com/my/module/@v/v1.0.0.info にGETリクエストを送る
- GOPROXY=“https://proxy.golang.org” をつけてmodule-aware modeでgo getする
- 例)
GOPROXY="https://proxy.golang.org" GO111MODULE=on go get example.com/my/[email protected]
- 例)
関連項目:
Reference:
オブジェクト指向プログラミング
Golangは型の継承をサポートしていないが、構造体とインタフェースを使いこなすと、オブジェクト指向プログラミングを実現ことができる。
NOTE:
- 構造体の埋め込みは継承とは異なるので、注意が必要
- インタフェースを使うとダックタイピングができるが、インタフェースはレシーバにはできない
参考:
- Frequently Asked Questions (FAQ) - The Go Programming Language#Is_Go_an_object-oriented_language
- Go言語で「embedded で継承ができる」と思わないほうがいいのはなぜか? - Qiita
- オブジェクト指向言語としてGolangをやろうとするとハマること - Qiita
- 上の牧さんの記事とほぼ同じことを言っている
- Goはオブジェクト指向言語だろうか? | POSTD
ロギング
標準のlogパッケージはミニマルなので、他言語から来たプログラマーなど、各位で拡張したくなることがよくある。
関連項目:
参考:
- loggingについて話そう - Qiita … Goにおける思想的な
- Log パッケージで遊ぶ — プログラミング言語 Go | text.Baldanders.info … ログレベル対応など
- go言語におけるロギングについて - blog.satotaichi.info … 筆者のオススメパッケージ紹介
正規表現
Webサーバなどで使うときは、パフォーマンスに気をつける必要がありそう。
関連項目:
参考:
テンプレート
標準パッケージのhtml/templateやtext/templateがよく使われる。
関連項目:
参考:
template構文
html/templateやtext/templateの構文。
Examples:
<ul>
<!-- ループ処理 -->
{{ range $i, $val := . }}
<ul>{{ $i }} : {{ $val }}
{{ end }}
</ul>
Tips:
- テンプレートにstructやmapを渡すと、
.key
のような形で要素/メンバ変数にアクセスできる
参考:
デバッグ
キーワード:
- スタックトレース
関連項目:
バリデータ
次の2つが有名そう:
参考:
- Go言語のバリデーションチェックライブラリ(ozzo-validation)を分かりやすくまとめてみた - Qiita
- go-playground/validator でバリデーションを実装する|maco|note
プロファイリング
※2017年以前の情報
- runtime/pprofという標準pkgを使うのが基本な感じ。
- その内 標準パッケージ - progrhyme’s Tech Wiki に書くと思う。
- runtimeのデバッグに役立つ環境変数の話:
参考:
- Profiling Go Programs - The Go Blog … pprof
- golangで書かれたプログラムのメモリ使用状況を見る - hakobe-blog ♨ … pprof, net/http/pprof
- golang profiling の基礎 … pprof他
- golangパフォーマンス3: mapとGC - Qiita
構造化データファイルの取り扱い
YAML, JSON, TOMLなど。
関連項目:
参考:
プラグイン機構
Go 1.8でpluginパッケージが標準ライブラリに入った。
他に、RPCスタイルのhashicorp/go-pluginなどもある。
参考:
リフレクション
reflectパッケージを使う。
参考:
コード生成
コンパイラ付属の go generate
によって、コードを自動生成できる。
ソースコード内に //go:generate COMMAND ARGUMENTS
というコメント行を追加することで、 go generate
が実行するコマンドを指定できる。
これは任意のコマンドを指定できるようだ。
参考:
- Generating code - The Go Blog
- go generateでコードを自動生成する
- 実行例と stringer から学ぶ go generate 入門 - Qiita
- go generate のベストプラクティス - Qiita