はじめに
前回の続きで Go 言語の文法をまとめておきたいと思います。
- Go言語基礎 その1 Go言語入門
- Go言語基礎 その2 Go言語の開発環境と go コマンド
- Go言語基礎 その3 Go言語の基本構文1 (コメント, 型, 変数, 定数, 演算子)
- Go言語基礎 その4 Go言語の基本構文2 (関数, init, 制御構文)
- Go言語基礎 その5 Go言語の基本構文3 (配列, interface, slice, map, 型アサーション, Defined type, Type alias)
- Go言語基礎 その6 Go言語の基本構文4 (ポインタ, 構造体, メソッド, タグ, インターフェイス)
- Go言語基礎 その7 Go言語の基本構文5 (可視性, スコープ, goto, defer, panic, recover, goroutine, channel)
Go言語文法
関数
func
を使用して定義- 連続する引数の型が同じ場合、最後の型以外省略可能
- 複数の戻り値を返すことが可能
- 複数の戻り値の一部を省略可能
func sum(a, b int) int {
return a + b
}
sum(1 + 2) // == 3
// Multiple results
// 複数の戻り値を返すことが可能
// 同じ型の場合、最後の型以外省略可能
func combine(s1, s2 string) (string, int) {
ret := s1 + s2
return ret, len(ret)
}
// _ を使用して戻り値の一部を無視することが可能
_, len := combine("Bob", "Ross")
// Named return values
// var s string といったローカル変数定義を短縮できる
func bob() (s string) {
s = "BobRoss"
return
}
// 使用しない引数を _ で無視することが可能
func ross(_, _ string) {
fmt.Println("Bob Ross")
}
// 関数の戻り値として関数を返すことも可能
func returnFunction() func() {
return func() {
fmt.Println("Returned function")
}
}
f := returnFunction()
f() // => "Returned function"
// 関数の引数として関数を渡すことも可能
func callFunction(f func()) {
f()
}
callFunction(func() {
fmt.Println("Called function")
})
// クロージャ
func increment() func() int {
i := 0
return func() int {
i += 1
return i
}
}
incr := increment()
fmt.Println(incr()) // => "1"
fmt.Println(incr()) // => "2"
fmt.Println(incr()) // => "3"
init
- パッケージの初期化を目的にした特殊な関数
func init()
を定義することができる - パッケージ変数の初期化の後に呼ばれる
main
パッケージ以外に定義されたfunc init()
は import されると呼び出される
func init() {
fmt.Println("init")
}
制御構文
- for
- break
- continue
- if ~ else if ~ else
- switch
- fallthrough
for {
/*無限ループ*/
if a == 1 {
break
} else if b == 2 {
continue
}
}
for i := 0; i < 100; i++ {
/* i が 0 ~ 99 まで繰り返し */
}
if v == 1 {
// v が 1 の場合
} else if v == 2 {
// v が 2 の場合
} else {
// v が 1,2 以外の場合
}
// 簡易文付きif
if err := doSomething(); err != nil {
fmt.Println("doSomething error")
}
この中でも switch
は case 文に条件を書いたり、型で分岐ができたりいろんな形がある
switch n {
case 1, 2:
fmt.Println("1 or 2")
case 3, 4:
fmt.Println("3 or 4")
default:
fmt.Println("unknown")
}
// fallthrough
switch n {
case 1, 2:
fallthrough
case 3, 4:
fmt.Println("1 or 2 or 3 or 4")
default:
fmt.Println("unknown")
}
// 式を伴うcase
switch {
case n > 0 && n < 2:
fmt.Println("0 < n < 2")
case 2 <= n && n < 4:
fmt.Println("2 <= n < 4")
}
// 型によるswitch
switch x.(type) {
case bool:
fmt.Println("bool")
case int, uint:
fmt.Println("int")
case string:
fmt.Println("string")
default:
fmt.Println("unknown type")
}
参考にした本
おわりに
次回は Go 言語の文法の続きを復習したいと思います。