Golang Defer Keyword

2020-03-09

Defer文

Goにはdefer文といって
関数やメソッドの実行を後から実行する、正確には関数などのreturn文や最後から近いところから順に実行させることができるdefer文が用意されています。

関数だけでなくメソッド、無名メソッドにも使えます。

文字だとちょっとわかりずらいので以下に例を示します。

サンプルコード

package main 

import "fmt"

// Functions
func add(n1, n2 int) int {
    res := n1 + n2
    fmt.Println("Result: ", res)
    return 0
}

// Main function
func main() { 

    fmt.Println("Start") 

    defer fmt.Println("End")
    defer add(20, 20)
    defer add(10, 10)
}

実行結果

Start
Result:  20
Result:  40
End

このようにdefer定義した関数の最後から順にできるようになります。
実際のケースでどの様に便利なのかは次に説明します。

Use Case

以下は実務でよく使うケースです。
DBセッションを閉じるとか、関数実行の最後にログを書き込むなど
あらかじめ後で実行することがわかっている事などを先に宣言しておけば、
実装し忘れたりなどのケアレスミスが防げます。

例えばDBセッションクローズなどはセッション開始の宣言の次の行に
セッションクローズを記述できることでかなりスッキリとよくなりました。

DBセッションクローズの例

~~

session := es.engine.NewSession()
defer session.Close()

fmt.Println("session start") 

~~

バッチの最後に標準出力する例

~~

defer func() {
	log.Println("finish!!")
}

if len(errorStrings) > 0 {
	fmt.Println(errorStrings)
	fmt.Printf("\n[ failed ] : %vec\n", end.Sub(start))
} else {
	fmt.Printf("\n[ success ] : %vec\n", end.Sub(start))
}

参照 Defer Keyword in Golang
https://www.geeksforgeeks.org/defer-keyword-in-golang/

golangdefer, golang

Posted by user