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


if

Cで必要な括弧は不要で、以下のような書き方となる。

if x > 0 {
    return y
}

以下のようにifの中に初期化文を書くことができる。

if err := file.Chmod(0664); err != nil {
    log.Stderr(err);
    return err;
}

Forループ

doやwhileループはGoには存在しない。ループはforにて記述する。

for i := 0; i < 10; i++ {
    ・・・
}

whileループの代用として以下のforループが可能

// Cのwhileのようなもの
for condition { }

// Cのfor(;;)のようなもの
for { }


配列、スライス、マップなどはrange節にてforeachのようなループが可能。

var m map[string]int;
sum := 0;
for _, value := range m {  // キーは未使用
    sum += value
}

swich

Go の swich は柔軟な書き方が可能

c := 'A'
switch {
    case '0' <= c && c <= '9':
        return c - '0'
    case 'a' <= c && c <= 'f':
        return c - 'a' + 10
    case 'A' <= c && c <= 'F':
        return c - 'A' + 10
    }
    return 0


カンマで複数条件を指定できる

switch c {
case ' ', '?', '&', '=', '#', '+', '%':
    return true
}
return false

可視性

名前(トップレベルの型名、関数名、メソッド名、定数名、変数名、構造体のフィールドおよびメソッド名)の先頭一文字が大文字になっていれば、外部パッケージから参照可能(exported)となる。

関数

単純な関数定義

func main() {
    ・・・・
}

スライスを受け取り int を返却する関数

func sum(a []int) int {
    ・・・・
}


関数は複数の値を返すことが出来る。

func nextInt(b []byte, i int) (int, int) {
    ・・・・
}

上記関数の利用は、戻り値をカンマで区切り受け取る

for i := 0; i < len(a); {
    x, i = nextInt(a, i);
}

戻り値には名前を指定することができる。

func nextInt(b []byte, pos int) (value, nextPos int) {
    ・・・・
}

上記例では関数内で int型の nextPos という変数を定義したのもとして扱われる。

メソッド

構造体Tのメソッド定義

type T struct {
    a int;
}
func (tv  T) Mv(a int)   int   { return 0 }  // 値レシーバ
func (tp *T) Mp(f float) float { return 1 }  // ポインタレシーバ
var t T;


メソッドには以下のようにアクセスできる。

t.Mv(7)
T.Mv(t, 7)
f := T.Mv; f(t, 7)

ポインタレシーバによるメソッドは、レシーバの中身を変更することができる。