Dragon Arrow written by Tatsuya Nakaji, all rights reserved animated-dragon-image-0164

go言語 制御構文

Oct 18, 2020

制御構文



条件分岐 if


  • 指定した条件で分岐する
    • elseは条件に当てはまらない場合
    • elseの後にifをさらにつけることができる
    • elseやelse ifは省略可能
package main
import "fmt"

func main() {
  x := 1


  if x == 1 {
      fmt.Println("xは1")
  } else if x == 2 {
      fmt.Println("xは2")
  } else {
      fmt.Println("xは1でも2でもない")
  }
}


条件式内だけで使用する変数をif文の式で定義できる

if a := f(); a > 0 {
    fmt.Println(a)
} else {
    fmt.Println(2*a)
}


条件分岐 switch

大量のif-elseをつなぐより可動性が上がる

  • breakがいらない
  • caseをまたぐ際にはfallthroughを使う

何もしないとbreakになる

switch(条件){
  case 値 :
    処理
   ・・・
  default:
    処理
}


package main
import "fmt"

func main(){
    a := "2"
    switch a {
        case "1":
            fmt.Println("1つめ")
        case "2":
            fmt.Println("2つめ") // 2つめが出力される
        default:
            fmt.Println("3つめ")
    }
}


switch直後に条件を指定しない場合は、caseに式を指定する

package main
import "fmt"

func main(){
    a := "2"
    switch {
        case a == "1":
            fmt.Println("1つめ")
        case a == "2":
            fmt.Println("2つめ") // 2つめが出力される
        default:
            fmt.Println("3つめ")
    }
}


fallthroughステートメントを使うと、式switchの次のcase節の先頭のステートメントへ制御をうつす(この場合caseの条件はみない)

package main
import "fmt"

func main(){
    a := 3
    switch a {
        case 1:
            fmt.Println("1つめ")
        case 2,3:
            fmt.Println("2つめ") // 2つめが出力される
            fallthrough
        case 4,5:
            fmt.Println("3つめ") // 2つめが出力される
        default:
            fmt.Println("4つめ")
    }
}

(出力)

2つめ 

3つめ


繰り返し for

処理を繰り返す時に使用する。最初にforを書くのでfor文と呼ばれる


for 初期化式  ; 条件式  ;  増減式 {
  繰り返される箇所
}

無限ループ

for {
}

rangeを使った繰り返し

for i, v := range []int{1, 2, 3} {
}


import "fmt"

func main(){
    for i := 0; i < 3; i++ {
            fmt.Println(i) // 0 1 2 が出力される
    }
    color1 := []string{"赤","黄","青"}
    for i := 0; i < len(color1); i++ {
        fmt.Println(color1[i]) // 赤 黄 青が出力される
    }
    for i, v := range []string{"猿", "鳥", "犬"} {
        fmt.Printf("インデックス:%d 値:%s\r\n", i, v)   
    }
}

(出力)

1

 2 

赤 

黄 

青 

インデックス:0 値:猿 

インデックス:1 値:鳥 

インデックス:2 値:犬


break

ループから抜け出すのに使用する


package main
import "fmt"

// breakによる無限ループの脱出
func main() {
    var i int // 0
    for {
        if i%2 == 1 {
            fmt.Println(i) // 1が出力される
            break
        }
        i++
    }
}


抜け出したいループをラベル指定でbreak

ラベル名はLOOPやLなどの名前がつけられることが多い

package main
import "fmt"


// ラベル指定のbreak
func main() {
    var i int
LOOP:
    for {
        switch {
        case i%2 == 1:
            fmt.Println(i)
            break LOOP
        }
        i++
    }
}


例題


1から100のうち、5の倍数を全て改行しながら出力するプログラム


package main
import "fmt"

func main() {
    for i := 1; i <= 100; i++ {
        if i%5 == 0 {
            fmt.Println(i)
        }
    }

    // switch版
    //for i := 1; i <= 100; i++ {
    //    switch {
    //    case i%5 == 0:
    //        fmt.Println(i)
    //    }
    //}
}