概要
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")を実行しています。