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 が可能?
- 外部に公開する API はエラーを伝える手段として panic() を使ってはいけない
- 内部的には可読性を上げるために使うらしい https://github.com/golang/go/wiki/PanicAndRecover#usage-in-a-package
Panic
以下のような流れで延々とエラーがスルーされるっぽい動き。try-cache で受けられる感じのものなのだろうか?
- panicが起きた時点でそれ以降に定義されている処理は行われない
- 呼び出し元(親)に
return
- 親では
F()
部分がpanicの呼び出しのように振る舞う - 親の処理が止まる
- さらにその上の呼び出し元(親の親)に
return
する - 親の親では親関数がpanicの呼び出しのように振る舞う
- …以下、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 の完了を待ち合わせできる機能