これをやる
そしてメモりたくなったことをメモって行く
while
while
みたいのはforで表現する。
func main() { value := 0 for true { fmt.Println("hello") value += 1 if value == 5 { break; } } }
無限ループ
func main() { for { fmt.Println("YEAH") } }
If with a short statement
条件の前に文を書ける。
func main() { if fmt.Println("hello"); true { fmt.Println("hello if") } }
Exercise: Loops and Functions
こんなん?(結局mathパッケージ使ってるっていう & 精度低過ぎ感あるけど)
package main import ( "math" "fmt" ) func Sqrt(x float64) float64 { z := float64(1) for i:= 0; i < 10; i++ { z -= calc(z, x) if math.Abs(x - z * z) < 0.000001 { fmt.Println(i) return z } } return z } func calc(z float64, x float64) float64 { return (z * z - x) / (2 * z) } func main() { fmt.Println(Sqrt(2)) }
switch
各caseの末尾に勝手にbreakが入るので、1つのswich文で1つのcaseしか実行されない。
default変なとこにかける(嬉しいケースなさそうだけど)
package main import ( "fmt" ) func main() { value := 1 switch value { default: fmt.Println("YEAHHHHHH") case 1: fmt.Println("YEAH") case 2: fmt.Println("YEAHYEAHYEAHYEAHYEAH") } }
変数とのマッチである必要がない
swich { case 関数の戻り値: case 関数の戻り値: case 関数の戻り値: default: }
みたいなことができる。
defer
return分実行後に呼び出し元に値を返す前に呼び出す処理を定義できる?
package main import "fmt" func get() string { fmt.Println("get") return "get" } func test() string { defer fmt.Println("test defer") return get() } func main() { fmt.Println("main:" + test()) }
この場合以下になる。
get test defer main:get
変数のスコープとか参照の話とかが出てきてないからdeferで戻り値の値を破壊的に変えちゃうようなことをするとどうなるのかよくわからん。
実行順序
deferを複数定義すると、定義順の逆に実行される。
感想
swichで勝手にbreakするのいいなーと思った。 deferは使いどころがいまいちわからん感じ。
func test(){ if(a == b){ postProcessiong() return a } postProcessiong() return b }
こういうのを
func test(){ defer postProcessiong() if(a == b){ return a } return b }
こうできて嬉しい的なあれかな?