はじめに
前回の続き、今回は制御構文
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とか