/golang

golangの言語仕様をmemo的にまとめたリポジトリ

Primary LanguageGo

golang

これはGo言語勉強用のリポジトリである。それぞれのディレクトリでgo runをして動作確認するための目的で作成した。

Goが目指すコト

Goは「Cの高速性とスクリプト言語の手軽さ」を両立させるコトを目指して設計されている。
その為、所々に奇妙な挙動(セミコロン省略によるコンパイルエラー等)が見受けられるが、「コードの表現力を上げる」ことよりも「コンパイル速度を速くする」ことを優先した方が最終的には開発者の利益になると判断したと言える。

Goの原則

  • 1つのディレクトリには1つのパッケージのみ
  • ディレクトリ名とパッケージ名は同一にしておく

go コマンド

# バージョン情報を確認
$ go version

# ビルドシステムに関係する環境変数の内容を確認
$ go env

# ソースコードを推奨される形式へ自動的に整形
# -n: 実行されるコマンドの表示(ファイルは書き換えない)
# -x: 実行されるコマンドの表示
$ go fmt [-n] [-x] [packages]

# パッケージのドキュメントを参照
# -u: 非公開な識別子やメソッドも含めてドキュメント出力
# -c: 識別子のマッチングで大文字と小文字を厳密に判定
$ go dog [-u] [-c] [package.]symbol[.method]
$ go doc math/rand # (例)math/randパッケージを指定
$ go doc time.Time.Unix # (例)timeパッケージのTime型のUnixメソッドを指定

# ビルドプロセスを隠蔽しつつ直接プログラムを実行
$ go run hello.go

# プログラムをビルド
# -o: 生成する実行ファイル名を指定
# -i: 依存するパッケージのインストールを実行
# -x: ビルドプロセスを表示
$ go build [-o output] [-i] [-x] [packages]
$ go build # (例)カレントディレクトリ内の全てのファイルをビルド
$ go build -o app -i -x foo # (例)fooパッケージをappという実行ファイルにビルド

# パッケージや実行ファイルをビルドした結果を既定の場所にインストール
# -x: インストールプロセスを表示
$ go install [-x] [packages]

# 外部パッケージのダウンロードとインストールをまとめて実行
# -d: 対象パッケージのダウンロードのみを実行し停止
# -f: 対象パッケージのパスから推測されるリポジトリへの検証をスキップ(-u指定時のみ)
# -fix: 対象パッケージの依存関係を解決する前にgo fixツールを適用
# -insecure: カスタムリポジトリを使用する場合に非セキュアなプロトコルの使用を許可(例:HTTP)
# -t: 対象パッケージに付属するテストが依存するパッケージも合わせてダウンロード
# -u: 対象パッケージの更新と依存パッケージの更新を検出して再ダウンロードとインストールを実行
# -x: ビルドプロセスを表示
$ go get [-d] [-f] [-fix] [-insecure] [-t] [-u] [-x] [packages]

# パッケージに付属しているテストを実行
# -c: パッケージのテストのビルドのみを実行
# -i: 依存するパッケージのインストールを実行
# -o: ビルドしたテストの実行ファイルを任意の名で出力
# -v: パッケージ内の個々のテスト結果も表示
# -cover: テスト結果の出力にカバレッジ率を追加
$ go test [-c] [-i] [-o] [-v] [-cover] [packages]
$ go test -v -cover foo # (例)fooパッケージを個別/カバレッジ出力も伴ってテスト

基本の言語仕様

識別子の命名規則

変数名や定数名・関数名は全てGoでは「識別子」になる。
これらの識別子に利用できる文字種は半角英数などの範囲に限定されず「Unicodeにおいて『文字』または『数字』と定義されたもの」に「_(アンダースコア)」を加えたものが許容される。

セミコロン

Goでは文の終端に「;(セミコロン)」が必要だが、コンパイラが自動で挿入してくれるので明示的に使用することほぼない。
しかし、視認性を考慮して以下の様に整形していると最後の要素("Suzuki")が文末と判定される。その為に不要なセミコロンが挿入されbuidエラーになってしまう。この様な場合は最後の要素にも「,(カンマ)」を置くことで解決できる。

a := [3]string{
  "Yamada",
  "Sato",
  "Suzuki" // 文末と判定される
}

テスト

Goには標準でパッケージのテスト機能が組み込まれている。
***_test.goのファイルはテストの為の特別なファイルとして扱われる。

定義済み識別子

識別子の種類 識別子
bool, byte, complex64, complex128, error, float32, float64, int, int8, int16, int32, int64, rune, string, uint, uint8, uint16, uint32, uint64, uintptr
定数 true, false, iota
ゼロ値 nil
関数 append, cap, close, complex, copy, delete, imag, len, make, new, panic, print, println, real, recover

Goが認識するファイル

拡張子 内容
.go Goのソースファイル
.c / .h Cのソースファイル
.cc / .cpp / .cxx / .hh / .hpp / .hxx C++のソースファイル
.m Objective-Cのソースファイル
.s / .S アセンブラソースファイル
.swig / .swigcxx SWIG定義ファイル
.syso システムオブジェクトファイル

参考書籍

スターティングGo言語