defer って何?

https://go.dev/tour/flowcontrol/12

A defer statement defers the execution of a function until the surrounding function returns.

The deferred call’s arguments are evaluated immediately, but the function call is not executed until the surrounding function returns.

defer : 延期する、遅延する 関数が終わるまで実行を遅延する defer call は即座に評価されるけど、実行は関数の終了まで遅延される

Panicでの使用

panic とかでも使われるらしい。panic で処理が止まって上位の関数に戻る前に defer が実行されるため、panic のハンドルや、終了処理(ソケットの終了)などを挟むことが可能っぽい

func testpanic() {
    defer func() {
        fmt.Println("inoke defer")
        err := recover()
        if err != nil {
            fmt.Println("Recover from error :", err)
        }
    }()

    fmt.Println("Start Panic")
    panic("Panic!")
}

func main() {
    testpanic()
}

recover と組み合わせることで try-catch が可能?

Panic

以下のような流れで延々とエラーがスルーされるっぽい動き。try-cache で受けられる感じのものなのだろうか?

  1. panicが起きた時点でそれ以降に定義されている処理は行われない
  2. 呼び出し元(親)にreturn
  3. 親ではF()部分がpanicの呼び出しのように振る舞う
  4. 親の処理が止まる
  5. さらにその上の呼び出し元(親の親)にreturnする
  6. 親の親では親関数がpanicの呼び出しのように振る舞う
  7. …以下、goroutine内の全ての関数がreturnされるまでコールスタックをさかのぼり続け、最終的にプログラムがクラッシュ

channel

chan で定義 close(chan)でクローズ <- , ->でデータの流れを表現できる アプリ外というより、アプリ内のキューという感じ?

受信専用と送信専用がある

c := make(<-chan int, 10) //送信
c := make(chan<- int, 10) //受信

例 : boolを送受信するch(?)

gochannel = make(chan bool)

groutine

goで並列処理する時の機能で、スレッドより細かい

記法

go 関数名
for 関数

以下のコマンドで確認可能

runtime.NumGoroutine()

wait :

groutine の完了を待ち合わせできる機能