A Tour of Goをやるぞ(Flow control statements: for, if, else, switch and defer)

これをやる

A Tour of Go

そしてメモりたくなったことをメモって行く

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 
}

こうできて嬉しい的なあれかな?

  • このチュートリアル?章立てがよくわからんなという気持ちになってきた
  • いわゆる初めてのGo的な書籍みたいのと比べるとだいぶ情報量足りてない感がある(最後までやってから言え)
  • Go以外の言語がなんとなくわかる人とかに、「Goいいやん」って思ってもらうためのチュートリアルみたいな感じなのかな