Go の特徴
- シンプルな言語仕様
- Class は無いがオブジェクト指向っぽい記述ができる
- interfaceがある
- ポインタはあるがポインタ演算はない
- タイプセーフである
- ガベージコレクションがある
- 並列処理の組み込みサポートがある
- コンパイルが異常に早い
Goのキーワード
break default func interface select case defer go map struct chan else goto package switch const fallthrough if range type continue for import return var
コメント
C++と同様に以下のコメントが可能。パッケージ宣言の前や、トップレベル要素の宣言の前のコメントはgodoc(Goのドキュメント生成ツール)によるドキュメントとなる。
/* ブロックコメント */ // 行コメント
パッケージのインポート
import ( "os"; // os パッケージのインポート "flag"; // flag パッケージのインポート )
"os" はパッケージをカレントディレクトリ、もしくは所定の場所から読み込むためのファイル名となる。ここでの例では os.Stdout.WriteString のように os パッケージを利用可能。
パッケージが競合する場合は以下のように別名を指定したインポートが可能
import osAlias "os"
この例では osAlias.Stdout.WriteString のように利用する。
文字列定数の宣言
トップレベルでの宣言(セミコロンは不要)
const Space = " " const Newline = "\n"
宣言リストを使用した例
const ( Space = " "; Newline = "\n"; )
変数宣言
var s string = "" var s = "" // 型指定の省略 s := "" // Go の簡易変数宣言
宣言リストで環境変数にて初期化する例
var ( HOME = os.Getenv("HOME"); USER = os.Getenv("USER"); GOROOT = os.Getenv("GOROOT"); )
数値型
uint8 // unsigned 8-bit 整数 (0 to 255) uint16 // unsigned 16-bit 整数 (0 to 65535) uint32 // unsigned 32-bit 整数 (0 to 4294967295) uint64 // unsigned 64-bit 整数 (0 to 18446744073709551615) int8 // 8-bit 整数 (-128 to 127) int16 // 16-bit 整数 (-32768 to 32767) int32 // 32-bit 整数 (-2147483648 to 2147483647) int64 // 64-bit 整数 (-9223372036854775808 to 9223372036854775807) float32 // 32-bit 浮動小数 float64 // 64-bit 浮動小数 byte // uint8のエイリアス
uint // 32 か 64 bits システム依存 int // 32 か 64 bits システム依存 float // 32 か 64 bits システム依存 uintptr // ポインタを格納するに十分な大きさの型
uint32と32ビットシステムのuintは異なる型として扱われる
文字列型
文字列は byte 型の配列ではなく、変更不可能な値(immutable)となる
string
s := "hello"; // s[1]のようにアクセスできる。この場合'e'
Array型
Goでは [長さ]型 の形で配列を定義する。
[32]byte // 長さ32のbyte配列 [2*N] struct { x, y int32 } // 長さ2*Nのstruct配列 [1000]*float64 // 長さ1000のfloat64ポインタ配列
配列のサイズは型の一部として扱われ、[10]int と [20]int は異なる型となる。また、Cと異なり配列は値であるため、配列間の代入は全要素のコピーとなる。関数に配列を渡した場合も同様でポインタではなく配列のコピーが渡される。
配列長は組み込み関数のlenで取得できる。aが配列の場合以下で配列長が得られる
>|go| var a [10]int; len(a)
スライス
配列や文字列の部分配列として切りだしたもの。配列へのポインタとサイズ、最大サイズを持った構造体のようなもの。配列を関数に渡すと配列のコピーが渡されるが、スライスを渡すことでサイズ制限のあるポインタを渡せる。
a := [4]int{1, 2, 3, 4}; // 配列定義 s := a[1:3]; // 配列aのスライス(要素1から3のスライス)
上記sは []int の型で、長さが2で、容量が3のスライス。
以下のように各要素にアクセスできる。
s[0] == 2 s[1] == 3