這個是之前遇到的一個問題,今天想起來了,閒來無事也就記錄一下吧。
下面的代碼有什麼問題嗎:
f, err := os.Open(filename)
defer f.Close()
if err != nil {
return nil, err
}
在剛接觸Go的時候,這塊兒代碼乍一看是沒問題的,但是運行的時候就會報錯,這麼簡單的代碼在當時的自己看來是沒有理由出錯的。
這裏就是defer的坑了。defer的作用和執行順序相比大家都是比較清楚的,在函數return之後,defer會先進後出相繼執行,所以之前打開了一個文件,在return之後,調用defer後的f.Close()關閉文件,完全沒毛病啊。
那麼問題出在哪兒呢?
原來,os.Open函數,如果打開一個文件失敗了,那麼是不需要進行close操作的,關閉一個沒有打開的文件句柄,defer中的close就會報錯。
所以一般的寫法是這樣的:
f, err := os.Open(filename)
if err != nil {
return nil, err
}
defer f.Close()
記錄一下以前遇到的小坑~