#deferは、遅延という意味だが分かりにくい。
###眺めるための例題
f7.go
package main
import (
"fmt"
"time"
)
func main() {
defer fmt.Println("全部終了しました。")
for i:=0;i<10;i++{
time.Sleep(1)
fmt.Println("i=",i)
}
}
//実行結果
>go run f7.go
i= 0
i= 1
i= 2
i= 3
i= 4
i= 5
i= 6
i= 7
i= 8
i= 9
全部終了しました。
最初に書いた **defer fmt.Println("全部終了しました。")**は、
for以降のステートメント以降に遅延されたことがわかる。
実際の場面
f8.go
package main
import (
"bufio"
"fmt"
"io"
"os"
)
func main() {
fp, err := os.Open("d:\\00data\\test_utf20.csv")
if err != nil {panic(err)}
defer fp.Close()
reader := bufio.NewReaderSize(fp, 4096)
for {
line, _, err := reader.ReadLine()
fmt.Println(string(line))
if err == io.EOF {
break
} else if err != nil {panic(err)}
}
}
上記のプログラムを眺めてみるとOpenしてdefer 付きのCloseをしている。
この表記は、もしファイルやio操作中に何らかのエラーが起きたときにcloseしてくれる。
#注意 皆さんは、エラーを起こすためにUsbFlashを引き抜かないでください。b壊れます。