概要
A Tour of Goの順番に沿ってGoの基本で個人的に学習したことをまとめています。
No | 記事 |
---|---|
1 | 【Go】基本文法①(基礎) |
2 | 〜〜【Go】基本文法②(フロー制御文)「今ココ」〜〜 |
3 | 【Go】基本文法③(ポインタ・構造体) |
4 | 【Go】基本文法④(配列・スライス) |
5 | 【Go】基本文法⑤(Maps・ Range) |
6 | 【Go】基本文法⑥(インターフェース) |
7 | 【Go】基本文法⑦(並行処理) |
8 | 【Go】基本文法総まとめ |
For(ループ)
Goは for
によってループ構造を実現します。
for
ループは ;
によって以下の3つの部分に分かれています。
①初期化ステートメント:最初のイテレーション(繰り返し)の前に初期化が実行されます。
②条件式:各繰り返し毎に評価されます。
③後処理ステートメント: 各繰り返しの最後に実行されます
①初期化ステートメントは、短い変数宣言によく利用され、その変数は for
のスコープ内でのみ有効です。
JS等の言語の様に ()
は必要ありませんが {}
は必要です。
package main
import "fmt"
func main() {
sum := 0
for i := 0; i < 10; i++ {
sum += i
fmt.Println(sum) //=> 0 1 3 6 10
}
}
①初期化ステートメント
と ③後処理ステートメント
はあくまでも任意で省略可能です。
また ;
も省略可能です。
package main
import "fmt"
func main() {
sum := 1
for sum < 1000 {
sum += sum
}
fmt.Println(sum) //=> 1024
}
If(条件分岐)
Goの if
は for
と同様に ()
は必要ありませんが {}
は必要となります。
if
ステートメントは、 for
のように、条件の前に、評価するための簡単なステートメントを書くことができます。(ここで宣言された変数は、 if
のスコープ内だけで有効です。)
package main
import "fmt"
func condition(arg string)string{
if v := "GO"; arg == v {
return "This is Golang"
}else{
return "This is not Golang"
}
}
func main(){
fmt.Println(condition("Swift")) //=> This is not Golang
}
Switch(条件分岐)
Go では選択された case だけを実行してそれに続く全ての case は実行されません。
package main
import "fmt"
func main(){
lang := "Go"
switch lang {
case "Ruby":
fmt.Println("This is Ruby")
case "Go":
fmt.Println("This is Go")
default:
fmt.Println("This is a programming language")
}
// => This is Go
}
switch
の前に何も条件を書かない場合はswitch true
と書くのと同じです。
if~then~else
の構文をよりシンプルに書くことが可能です。
package main
import "fmt"
func main(){
lang := "Go"
switch {
case lang == "Ruby":
fmt.Println("This is Ruby")
case lang == "Go":
fmt.Println("This is Go")
default:
fmt.Println("This is a programming language")
}
// => This is Go
}
Defer(遅延実行)
defer
へ渡した関数の実行を呼び出し元の関数の終わり(return
する)まで遅延させます。
以下の例ではdefer
に渡した関数(fmt.Println("World")
)が呼び出し元の関数(func main()
)の終わりまで遅延されています。
package main
import "fmt"
func main(){
defer fmt.Println("World")
fmt.Println("Hello")
//=> Hello
//=> World
}
複数の関数をdefer
に渡した場合
defer
へ渡した関数が複数ある場合、その呼び出しはスタックされます。
呼び出し元の関数がreturn
するとき、defer
へ渡した関数は新しいデータ→古いデータLIFO(last-in-first-out)
の順番で実行されます。
つまり、最初にdeferされた行が一番最後に実行される構造になります。
package main
import "fmt"
func main(){
defer fmt.Println("Golang") //defer1
defer fmt.Println("Ruby") //defer2
fmt.Println("JS")
//=> JS
//=> Ruby
//=> Golang
}
上記の例では元の関数func main()
中の fmt.Print("JS")
を実行した後により新しい情報であるfmt.Print("Ruby")
を実行し、最後にもっとも古い情報であるfmt.Print("Golang")
を実行しています。