A Tour of Go
時折、コードを変更したり、関連記事を調べたりしながら、学習しました。
for
func main() {
sum := 0
for i :=0; i < 10; i++ {
sum += i
fmt.Println(i)
fmt.Println(sum)
}
}
#省略可能
for ; sum < 100; {
sum += sum
}
#さらに省略可能
for sum < 100 {
sum += 100
}
# 無限ループ
for {
}
if
func judge(x int) string {
if x > 0 {
return "マイナス"
}
return fmt.Println("プラス")
}
func main() {
fmt.Println(judge(−100))
}
>> "マイナス"
#注意 returnどちらか一つ
if文内の returnに到達したら、
if文外の return の戻り値は返ってこない
条件の前に変数を定義できる
条件の前に定義した変数はifのスコープ内のみ使用可能
もちろん、elseブロッック内でも使用可能
func pow(x, n, lim float64) float64 {
if v := math.pow(x, n); v < lim {
return v
} else {
return v+10
}
return lim
}
func main() {
fmt.Println(
pow(3, 2, 10)
pow(3, 3, 20)
)
}
>> 9
>> 127
#スコープ外で使うとエラー
if v := 10: v < 100 {
return "100以下"
}
fmt.Println(v)
>> undefined: v
#Switch
breakはいらない
caseの条件が一致すれば、自動的にbreakする
runtime.GOOSで実行しているOSを判定できる
func main() {
fmt.Printl("Go runs on")
switch os := runtime.GOOS; os {
case "darwin":
fmt.Println("OS x.")
case "linux":
fmt.Println("Linux.")
default:
fmt.Printf("%s.\n", os)
}
}
switch {
t := time.now()
case t.Hour() < 12:
fmt.Println("Good morning")
case t.Hour() < 17:
fmt.Println("Good afternoon")
default:
fmt.Println("Good evening")
}
#Defer
呼び出し元の関数が終わるまで、deferに渡した関数の実行を遅らせる
deferに渡した関数の引数はすぐに評価される
[Go言語のdeferを正しく理解する | How defer in Golang works](https://qiita.com/Ishidall/items/8dd663de5755a15e84f2 #)
func main() {
world := "world"
defer fmt.Println(world)
world = "new world"
fmt.Println("hello")
}
> hello
# deferにより、main()関数が終わった後に実行される
# しかし、worldはすぐに評価されるので、deferの後に"new world" と変更しても、反映されない
> world