A Tour of Goも中盤に差し掛かり基本構文の章に差し掛かりました。
For文
- 普通のfor文
func main() {
sum := 0
for i := 0; i < 10; i++ {
sum += i
}
fmt.Println(sum)
}
- while文的な書き方
func main() {
sum := 1
for ; sum < 1000; {
sum += sum
}
fmt.Println(sum)
}
ということはもちろんセミコロンを排除できる
func main(){
sum := 1
for sum < 1000 {
sum += sum
}
fmt.Println(sum)
}
スラっとした綺麗なコード、if文まだ触ってないからあれやけど、for bool
もできるのでは?
- 無限ループ
func main(){
for {
}
}
if文
- 典型的なif文構築
package main
import (
"fmt"
"math"
)
func sqrt(x float64) string {
if x < 0 {
return sqrt(-x) + "i"
}
return fmt.Sprint(math.Sqrt(x))
}
func main() {
fmt.Println(sqrt(2), sqrt(-4))
}
- 前にステートメントを付けたとき
func pow(x, n, lim float64) float64 {
if v := math.Pow(x, n); v < lim {
fmt.Println(v)
return v
}
return lim
}
このコードを理解するのに時間がかかったくらいにはプログラミング初心者なのかもしれない()
最初の ` v := math.Pow(x,n); でステートメントを追加してvにxをn乗したものを代入して、
if v < limならこのメソッドは戻り値にvを返す。違うならlimをっていう形ですねー。
マジでちょっと悩んだのが悔しい。
- else文
func pow(x, n, lim float64) float64 {
if v := math.Pow(x, n); v < lim {
return v
} else {
fmt.Printf("%g >= %g\n", v, lim)
}
return lim
}
elseを入れる場合もこのケースでのvなどのif文で生成した変数は、スコープ内として扱える。
ほう。。。なるほど。。。
割と簡単なケースが多くて割と安心したっていうのが正直なところっていう感じ。
Switch文
func main() {
fmt.Println("When's Saturday?")
today := time.Now().Weekday()
fmt.Println(today)
switch time.Saturday {
case today + 0:
fmt.Println("Today.")
case today + 1:
fmt.Println("Tomorrow.")
case today + 2:
fmt.Println("In two days.")
default:
fmt.Println("Too far away.")
}
}
一般的な記法と同じでif else構文を短縮したもの。便利でいいなーってサンプルコードを読んでて思ったのは、time.Now().Weekday()って呼ぶだけで、当日の曜日がわかるのは正直激アツ。
- switch trueも可
func main() {
t := time.Now()
switch {
case t.Hour() < 12:
fmt.Println("Good morning!")
case t.Hour() < 17:
fmt.Println("Good afternoon.")
default:
fmt.Println("Good evening.")
}
}
なるほど。簡単
defer
これやばい、意味わかんね。やばい。
func main() {
x := 1
defer fmt.Println(x)
x = 2
fmt.Println("hello")
}
//出力結果
//hello
//1
deferはその呼び出し元のメソッドがリターンすると呼び出されるもの。参照はトップダウンで終わるが、呼び出しが実行後にくるって、なるほど。参照が先にされるのが少し自分的にははてながつくが、まぁそういうもんだろうと一旦流す。
- Last-in-First-Out
func main() {
fmt.Println("counting")
for i := 0; i < 10; i++ {
defer fmt.Println(i)
}
fmt.Println("done")
}
この場合はLiFOの原理によって9から逆順になる。最後に入れたものが最初に出てきて、最初に準備してた人が最後に出てくる。逆リハ。的な。その。的な?