LoginSignup
1
1

More than 5 years have passed since last update.

Go言語はじめました その3

Last updated at Posted at 2018-04-04

はじめに

前回の続き、今回は制御構文

for

package main

func main() {
    sum := 0
    for i := 0; i < 10; i++ {
        sum += i
    }
    println(sum)
}
45

率直にいってC言語から()をとっただけ

ちなみにfmt.Println()ではなくprintlnで出力していますがprintlnでは出力のフォーマットができないのでfmtのパッケージにあるPrintf関数は使いましょう
実際ただ出力するならprintlnでも事足りると思います

for {}のように条件を指定しなければ無限ループができます(いつ使うんや?)

whileがない!?

package main

func main() {
    sum := 1
    for sum < 100 {
        sum += sum
    }
    println(sum)
}

128

Goではwhileがなくforを使ってwhileのように書きます
正直びっくり(実際最近while使ってないけど)

if

package main

import "math/rand"

func main() {
    var num = rand.Intn(15)
    if num >= 10 {
        print("10以上")
    } else if num >= 5 {
        print("5以上")
    } else {
        print("4以下")
    }
}

やっぱり()がなくなっただけ、みなさんおなじみのif文です

ifステートメント

package main

import "math"

// targetのn乗がlimitを超えているか判定する関数
func checkPowLimit(target, n, limit float64) bool {
    if v := math.Pow(target, n); v <= limit { //<- ここ!
        return true
    } else {
        return false
    }
}

func main() {
    println(checkPowLimit(2, 3, 10))
    println(checkPowLimit(2, 4, 10))
}
true
false

forと同じように条件を記述する前に 簡単なステートメントを記述することができます
ここではtargetのn乗をvに代入した後、評価をしています

switch

package main

import "runtime"

func main() {
    switch os := runtime.GOOS; os {
    case "darwin":
        print("Mac!")
    case "linux":
        print("Linux")
    default:
        print(os)
    }
}

switchですがGoでは選択されたcaseのみを実行するので他の言語でいうbreakを書く必要がありません
これは地味に嬉しいヾ(o´∀`o)ノワァーィ♪

switchでもif else

package main

import "time"

func main() {
    t := time.Now()
    switch {
    case t.Hour() < 12:
        print("Good morning!")
    case t.Hour() < 17:
        print("Good afternoon")
    default:
        print("Good evening")
    }
}

こんな感じでもかけます if elseより見やすい気がしないでもない

Defer

func main() {
    defer print("World")

    print("Hello")
}
HelloWorld

deferは呼び出された関数が終了するまで実行されません(ぶっちゃけいつ使うんや?)

Stacking defers

package main

func main() {
    for i := 0; i < 10; i++ {
        defer println(i)
    }
    println("Start!")
}
Start!
9
8
7
6
5
4
3
2
1
0

deferは複数使えるらしい(スタックっぽい、いやむしろスタック)
これがFILOってやつか! なんかの授業でやった記憶がpushとかpopとか

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1