Go 言語仕様の簡単なまとめ 1


Go の特徴

  • シンプルな言語仕様
  • Class は無いがオブジェクト指向っぽい記述ができる
  • interfaceがある
  • ポインタはあるがポインタ演算はない
  • タイプセーフである
  • ガベージコレクションがある
  • 並列処理の組み込みサポートがある
  • コンパイルが異常に早い

ソースファイルの文字コード

UTF-8と規定されている

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