Go言語のdeferは指定した部分の処理を遅らせる処理です。
一体どういう事を処理で見ていきます。
【理由】
defer 関数(またはメソッド)呼び出し
このような処理をすると指定部分の処理が後から呼び出されます。
実際に簡単なコードで見ていきましょう。
package main
import "fmt"
func main() {
defer fmt.Println("world")
fmt.Println("hello")
}
hello
world
defer fmt.Println("world")が後から処理されます。
なので後からworldとなります。
【具体例】
package main
import "fmt"
func foo(x, y int) int {
defer fmt.Println(x + y)
x = x * x
y = y * y
return x + y
}
func main() {
fmt.Println(foo(1, 2))
}
3
5
defer fmt.Println(x + y)が後から処理されるので1が入った変数x同士かけ、2が入った変数y同士かけてdeferの部分で足したのがでるので3
5となります。
// 置き関数呼び出しはスタックにプッシュされます。関数が戻ると
// 延期された通話は、最後の最初の順序で実行されます。//
package main
import "fmt"
func main() {
fmt.Println("conting")
for i := 0; i < 10; i++ {
defer fmt.Println(i)
}
fmt.Println("done")
}
conting
done
9
8
7
6
5
4
3
2
1
0
先にcontingとdoneになります。
for i := 0; i < 10; i++ {
defer fmt.Println(i)
}
をすると通常とは逆に回数処理します。
10未満からなので9 8 7となります。
【結論】
基本的な使い方は
funcA1の中で funcB2の前に defer をつけると funcB2の実行を funcA1が終了するタイミングまで遅延することができます。
取材やお仕事紹介などはこちらからお気軽にご連絡下さい。
ysa7825@gmail.com