AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當前位置:首頁 > 科技  > 軟件

Go 中如何檢查文件是否存在?可能產生競態條件?

來源: 責編: 時間:2024-02-05 17:20:09 226觀看
導讀Go 中如何檢查文件是否存在呢?如果你用的是 Python,可通過 os.path.exists 這樣的標準庫函數實現。遺憾的是,Go 標準庫沒有提供這樣直接的函數,但好在,沒有直接的,卻有不那么直接的方法。本文將基于這個話題展開,介紹 Go 中

Go 中如何檢查文件是否存在呢?BfD28資訊網——每日最新資訊28at.com

如果你用的是 Python,可通過 os.path.exists 這樣的標準庫函數實現。遺憾的是,Go 標準庫沒有提供這樣直接的函數,但好在,沒有直接的,卻有不那么直接的方法。BfD28資訊網——每日最新資訊28at.com

本文將基于這個話題展開,介紹 Go 中如何檢查文件是否存在。BfD28資訊網——每日最新資訊28at.com

另外,本文最后還會介紹一個小注意點,即在判斷文件是否存在時,如何避免中潛在的競態條件。BfD28資訊網——每日最新資訊28at.com

os.Stat 檢查文件狀態

Go 標準庫雖然沒有提供類似于 os.Exist 這樣直接的函數檢查文件是否存在,但它提供另外一個函數 os.Stat。BfD28資訊網——每日最新資訊28at.com

os.Stat 函數的作用是獲取文件狀態信息,我們通過檢查它返回的錯誤即可知曉文件是否存在。BfD28資訊網——每日最新資訊28at.com

圖片圖片BfD28資訊網——每日最新資訊28at.com

示例代碼,如下所示:BfD28資訊網——每日最新資訊28at.com

func main() {  _, err := os.Stat("/path/to/file")  if err != nil {    if os.IsNotExist(err) {      // 文件不存在    } else {      // 其他錯誤    }  }  // 文件存在}

第一個返回值表示文件信息,不是我們關心的重點,直接省略掉。BfD28資訊網——每日最新資訊28at.com

第二個返回值表示錯誤 error。如果文件不存在,可通過檢查 os.IsNotExist 檢查 error 是否是 os.ErrNotExist,確定文件是否存在。BfD28資訊網——每日最新資訊28at.com

與 C 對比

上面的示例中,我們使用 os.Stat 函數獲取文件的狀態,通過 errors.Is 判斷返回錯誤,如果是 os.ErrNotExist,則文件不存在。BfD28資訊網——每日最新資訊28at.com

不得不說,這其實更底層更標準的做法。BfD28資訊網——每日最新資訊28at.com

類似于 Python 等高級語言,提供 os.path.exist 主要是為了方便編程,提高效率。BfD28資訊網——每日最新資訊28at.com

如果使用 Unix C 實現同樣的功能,示例代碼如下:BfD28資訊網——每日最新資訊28at.com

#include <errno.h>#include <stdio.h>#include <sys/stat.h>int main() {  struct stat buffer;  int exist = stat("/path/to/file", &buffer);  if (exist != 0) {    if (errno == ENOENT) { /* 文件不存在*/ }     else { /* 其他錯誤 */ }    return 0;  }  // 文件存在  return 0;}

是不是和我們前面代碼基本是一個模子。BfD28資訊網——每日最新資訊28at.com

Go1.13 以及之后推薦使用 errors.Is

自 Go 1.13 起,推薦使用 os.Stat 和 errors.Is 的組合。這種方法提供了更一致和靈活的錯誤處理方式。BfD28資訊網——每日最新資訊28at.com

具體而言,即使是經過包裹的錯誤,errors.Is 依然能夠識別。BfD28資訊網——每日最新資訊28at.com

我期初認為,os.IsNotExist 能識別包裹 error,但不太確定,于是寫了個代碼簡單測試了下。BfD28資訊網——每日最新資訊28at.com

示例代碼,如下所示:BfD28資訊網——每日最新資訊28at.com

_, err := os.Stat("/path/to/file")  // 這是一個不存在的文件路徑werr := fmt.Errorf("Main: %w", err) // 包裹生成新錯誤fmt.Println(os.IsNotExist(err))     // 返回 true,表示不存在,這是錯誤結果fmt.Println(os.IsNotExist(werr))    // 返回 false,表示存在fmt.Println(errors.Is(werr, os.ErrNotExist)) // 返回 true 表示不存在

測試結果都已寫在注釋中。BfD28資訊網——每日最新資訊28at.com

如上可知, os.IsNotExist 只能識別最初的 error,如果錯誤經過 fmt.Errorf 包裹,則必須使用 errors.Is 識別。BfD28資訊網——每日最新資訊28at.com

圖片圖片BfD28資訊網——每日最新資訊28at.com

一句話概括,os.IsNotExist 可以用,但有適用范圍,而 errors.Is 則更通用。BfD28資訊網——每日最新資訊28at.com

這一般也同樣適用于其他類似的庫。BfD28資訊網——每日最新資訊28at.com

直接使用 Open 避免競態條件

到這里,基本已經解答了 Go 中如何檢查文件存在性的問題。BfD28資訊網——每日最新資訊28at.com

但,我還想引入一個討論:并發場景下,如何避免檢查文件存在性時引入潛在的競態條件?BfD28資訊網——每日最新資訊28at.com

簡言之,文件狀態可能在檢查和操作發生變化。BfD28資訊網——每日最新資訊28at.com

圖片圖片BfD28資訊網——每日最新資訊28at.com

什么是更好的做法呢?BfD28資訊網——每日最新資訊28at.com

我們可以直接嘗試打開或操作文件,根據返回結果判斷錯誤。BfD28資訊網——每日最新資訊28at.com

示例代碼如下:BfD28資訊網——每日最新資訊28at.com

file, err := os.Open("/path/to/file")if err != nil {    if errors.Is(err, os.ErrNotExist) {        // 文件不存在    } else {        // 處理其他類型的錯誤    }}

如上代碼中,你通過 open 直接打開一個文件,如果文件不存在,os.Open 將返回一個錯誤,我們檢查 error 確定下一步的操作。BfD28資訊網——每日最新資訊28at.com

通過這種方式,我們可以避免打開文件時引入競態條件。BfD28資訊網——每日最新資訊28at.com

open 是原子操作?

讀到這里,可能有人不禁問,為什么 open 能避免競態條件呢?它是原子操作嗎?BfD28資訊網——每日最新資訊28at.com

是的。BfD28資訊網——每日最新資訊28at.com

圖片圖片BfD28資訊網——每日最新資訊28at.com

系統調用都是原子操作,操作系統會保證操作過程不受到干擾。如果出現問題,也會進行回滾操作.BfD28資訊網——每日最新資訊28at.com

這一點對于 Open 同樣使用。BfD28資訊網——每日最新資訊28at.com

當我們使用 open 打開一個文件時,系統會確保在這個操作完成前,不會受其他操作干擾,包括如檢查文件是否存在、創建文件描述符、分配必要的資源等。BfD28資訊網——每日最新資訊28at.com

結論

本文通過一個小小的問題:Go 語言中如何檢查文件是否存在,除了引出 Go 中檢查文件是否存在的基本方法。同時,還介紹了文件操作時如何避免潛在的競態條件,進一步了解到一個有趣的小知識,Unix 系統調用是原子性操作。BfD28資訊網——每日最新資訊28at.com

最后,還是希望本文能幫助各位在 GO 語言的學習道路上起到一點微末作用。BfD28資訊網——每日最新資訊28at.com

博客地址:Go 中如何檢查文件是否存在?可能產生競態條件?[1]BfD28資訊網——每日最新資訊28at.com

引用鏈接

[1] Go 中如何檢查文件是否存在?可能產生競態條件?: https://www.poloxue.com/posts/2024-02-05-check-if-file-exists-in-golang/BfD28資訊網——每日最新資訊28at.com

BfD28資訊網——每日最新資訊28at.com

本文鏈接:http://www.tebozhan.com/showinfo-26-74190-0.htmlGo 中如何檢查文件是否存在?可能產生競態條件?

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: ?Thread Local深度解析,你學會了嗎?

下一篇: 100000行級別數據的 Excel 導入優化之路

標簽:
  • 熱門焦點
Top