Go踩坑之:defer

這個是之前遇到的一個問題,今天想起來了,閒來無事也就記錄一下吧。

下面的代碼有什麼問題嗎:

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()

記錄一下以前遇到的小坑~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章