Road to Gopher

Gopherを名乗る上で必須と思われる基礎的・汎用的なトピックを扱う。
あるいは用途別逆引き見出しリスト。

前提:

例外処理

入門ガイド:

関連項目:

参考:

テスト

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にすぐに反映されないことがある。
その場合、以下いずれかの操作を行う:

関連項目:

Reference:

オブジェクト指向プログラミング

Golangは型の継承をサポートしていないが、構造体とインタフェースを使いこなすと、オブジェクト指向プログラミングを実現ことができる。

NOTE:

  • 構造体の埋め込みは継承とは異なるので、注意が必要
  • インタフェースを使うとダックタイピングができるが、インタフェースはレシーバにはできない

参考:

ロギング

標準のlogパッケージはミニマルなので、他言語から来たプログラマーなど、各位で拡張したくなることがよくある。

関連項目:

参考:

正規表現

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つが有名そう:

参考:

プロファイリング

※2017年以前の情報

参考:

構造化データファイルの取り扱い

YAML, JSON, TOMLなど。

関連項目:

参考:

プラグイン機構

Go 1.8でpluginパッケージが標準ライブラリに入った。

他に、RPCスタイルのhashicorp/go-pluginなどもある。

参考:

リフレクション

reflectパッケージを使う。

参考:

コード生成

コンパイラ付属の go generate によって、コードを自動生成できる。

ソースコード内に //go:generate COMMAND ARGUMENTS というコメント行を追加することで、 go generate が実行するコマンドを指定できる。
これは任意のコマンドを指定できるようだ。

参考: