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)
ポインタレシーバによるメソッドは、レシーバの中身を変更することができる。