日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

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

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

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

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

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

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

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

os.Stat 檢查文件狀態

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

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

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

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

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

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

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

與 C 對比

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

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

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

如果使用 Unix C 實現同樣的功能,示例代碼如下:e2r28資訊網——每日最新資訊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;}

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

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

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

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

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

示例代碼,如下所示:e2r28資訊網——每日最新資訊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 表示不存在

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

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

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

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

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

直接使用 Open 避免競態條件

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

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

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

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

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

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

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

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

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

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

open 是原子操作?

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

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

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

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

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

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

結論

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

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

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

引用鏈接

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

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

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

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

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

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

標簽:
  • 熱門焦點
  • K60至尊版狂暴引擎2.0加持:超177萬跑分斬獲性能第一

    Redmi的后性能時代戰略發布會今天下午如期舉辦,在本次發布會上,Redmi公布了多項關于和聯發科的深度合作,以及新機K60 Ultra在軟件和硬件方面的特性,例如:“K60 至尊版,雙芯旗艦
  • 俄羅斯:將審查iPhone等外國公司設備 保數據安全

    iPhone和特斯拉都屬于在各自領域領頭羊的品牌,推出的產品也也都是數一數二的,但對于一些國家而言,它們的產品可靠性和安全性還是在限制范圍內。近日,俄羅斯聯邦通信、信息技術
  • 得物效率前端微應用推進過程與思考

    一、背景效率工程隨著業務的發展,組織規模的擴大,越來越多的企業開始意識到協作效率對于企業團隊的重要性,甚至是決定其在某個行業競爭中突圍的關鍵,是企業長久生存的根本。得物
  • .NET 程序的 GDI 句柄泄露的再反思

    一、背景1. 講故事上個月我寫過一篇 如何洞察 C# 程序的 GDI 句柄泄露 文章,當時用的是 GDIView + WinDbg 把問題搞定,前者用來定位泄露資源,后者用來定位泄露代碼,后面有朋友反
  • 從零到英雄:高并發與性能優化的神奇之旅

    作者 | 波哥審校 | 重樓作為公司的架構師或者程序員,你是否曾經為公司的系統在面對高并發和性能瓶頸時感到手足無措或者焦頭爛額呢?筆者在出道那會為此是吃盡了苦頭的,不過也得
  • Temu起訴SHEIN,跨境電商戰事升級

    來源 | 伯虎財經(bohuFN)作者 | 陳平安日前據外媒報道,拼多多旗下跨境電商平臺Temu正對競爭對手SHEIN提起新訴訟,訴狀稱Shein&ldquo;利用市場支配力量強迫服裝廠商與之簽訂獨家
  • 8月見!小米MIX Fold 3獲得3C認證:支持67W快充

    這段時間以來,包括三星、一加、榮耀等等有不少品牌旗下的最新折疊屏旗艦都得到了不少爆料,而小米新一代折疊屏旗艦——小米MIX Fold 3此前也屢屢被傳
  • 英特爾Xe-HP項目終止,將專注Xe-HPC/HPG系列顯卡

    據10 月 31 日消息報道,英特爾高級副總裁兼加速計算系統和圖形事業部總經理 表示,Xe-HP“ Arctic Sound” 系列服務器 GPU 已經應用于 oneAPI devcloud 云服
  • 2022爆款:ROG魔霸6 冰川散熱系統持續護航

    喜逢開學季,各大商家開始推出自己的新產品,進行打折促銷活動。對于忠實的端游愛好者來說,能夠擁有一款夢寐以求的筆記本電腦是一件十分開心的事。但是現在的
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
99国产精品视频免费观看| 亚洲国产高清一区| 国产日韩欧美夫妻视频在线观看| 久久人91精品久久久久久不卡| 99精品国产在热久久| 一区二区三区视频观看| 亚洲成人在线视频播放| 国产日韩欧美一区二区三区在线观看 | 欧美精品aa| 老色批av在线精品| 欧美一区二区三区免费看| 日韩视频一区| 亚洲激情在线激情| 在线观看日韩av电影| 国产一区二区福利| 国产人久久人人人人爽| 亚洲国产乱码最新视频| 亚洲国产毛片完整版| 亚洲私人黄色宅男| 99一区二区| 亚洲视频一区在线| 久久综合福利| 欧美视频四区| 欧美丝袜一区二区三区| 极品裸体白嫩激情啪啪国产精品| 国产亚洲制服色| 国产精品亚洲综合一区在线观看 | 欧美日韩国产欧| 亚洲综合视频网| 日韩一区二区免费看| 亚洲精品综合| 艳女tv在线观看国产一区| 一本一本久久a久久精品综合妖精| 欧美一区二区精品| 欧美在线日韩在线| 久久久久国产精品www| 久久国产精品一区二区三区四区| 久久久91精品国产一区二区三区| 欧美精品三级日韩久久| 欧美日韩亚洲精品内裤| 国产精品porn| 国产精品理论片在线观看| 国产精品综合av一区二区国产馆| 欧美日韩免费精品| 一区二区三区在线观看视频| 在线不卡欧美| 日韩一级片网址| 久久永久免费| 欧美日韩国产三级| 欧美日韩亚洲成人| 国产精品一区免费在线观看| 国产日韩成人精品| 一区二区三区精品国产| 午夜欧美精品久久久久久久| 久久久久国产精品一区二区| 毛片基地黄久久久久久天堂| 欧美日韩精品在线播放| 国产精品丝袜久久久久久app| 亚洲麻豆一区| 女女同性精品视频| 欧美丝袜一区二区三区| 国产亚洲欧洲一区高清在线观看 | 亚洲成色777777女色窝| 欧美一区二区视频免费观看| 国产精品久久久久毛片大屁完整版 | 久久爱另类一区二区小说| 久久国产直播| 国产精品网红福利| 在线国产精品一区| 久久九九全国免费精品观看| 国产伦精品免费视频| 在线国产日韩| 亚洲一级二级| 老司机精品视频网站| 欧美日韩精品免费| 亚洲日本欧美| 欧美三级视频在线观看| 国产精品视频一区二区高潮| 一区二区毛片| 蜜臀99久久精品久久久久久软件 | 亚洲欧美日韩人成在线播放| 美女诱惑一区| 在线观看中文字幕不卡| 麻豆精品91| 亚洲国产精品嫩草影院| 久久综合激情| 国产精品久久久久久一区二区三区| 一区二区久久久久| 欧美亚韩一区| 尤物网精品视频| 亚洲欧美www| 欧美好骚综合网| 国产网站欧美日韩免费精品在线观看 | 国产精品户外野外| 91久久黄色| 欧美专区在线观看一区| 国产三区精品| 久久久水蜜桃| 亚洲黄色性网站| 欧美日韩精品是欧美日韩精品| 99综合在线| 国产精品美女999| 99精品欧美一区| 国产精品99一区二区| 午夜精品影院| 国产精品国产三级国产aⅴ入口| 亚洲性感激情| 国产亚洲一区二区在线观看| 久久嫩草精品久久久久| 亚洲国产精品久久精品怡红院 | 国产精品极品美女粉嫩高清在线| 午夜一区二区三视频在线观看 | 在线免费观看日韩欧美| 欧美国产在线电影| 亚洲香蕉成视频在线观看| 国产色产综合色产在线视频| 久热精品视频在线| 99国产精品视频免费观看一公开| 国产精品午夜电影| 美女露胸一区二区三区| 一本一本a久久| 国产偷国产偷亚洲高清97cao| 久久综合狠狠综合久久综合88| 亚洲乱码精品一二三四区日韩在线 | 国产精品麻豆欧美日韩ww| 一区二区三区福利| 国产欧美日韩不卡| 西西人体一区二区| 亚洲成人中文| 国产精品成人免费| 亚洲无亚洲人成网站77777| 欧美日韩亚洲视频一区| 9i看片成人免费高清| 国产午夜精品全部视频播放| 欧美大片在线观看一区| 亚洲第一页自拍| 欧美mv日韩mv国产网站app| 在线观看日产精品| 欧美日韩一级片在线观看| 欧美中文字幕在线观看| 黄色在线成人| 久久另类ts人妖一区二区| 激情久久久久久久久久久久久久久久| 久久精品国产亚洲高清剧情介绍| 国产亚洲在线观看| 欧美日韩精品二区| 久久久av水蜜桃| 这里只有精品丝袜| 国产精品影视天天线| 欧美成人影音| 一区二区三区四区蜜桃| 黄色成人av在线| 国产精品久久久久aaaa九色| 欧美不卡高清| 久久精品在线播放| 亚洲一区综合| 亚洲精品一区二区三区福利 | 亚洲精品国产无天堂网2021| 欧美日韩一级片在线观看| 久久久久欧美精品| 亚洲精品国精品久久99热| 国产无一区二区| 国产精品啊v在线| 久久www成人_看片免费不卡| 夜夜嗨av一区二区三区中文字幕 | 久久先锋影音| 亚洲精品欧美| 国产精品h在线观看| 欧美成人综合| 久久久无码精品亚洲日韩按摩| 亚洲综合导航| 日韩视频中午一区| 国产精品永久免费在线| 欧美母乳在线| 欧美在线一区二区| 亚洲视频碰碰| 国产日韩一区二区三区| 欧美午夜一区| 欧美日韩1区| 欧美成人精品| 久久综合给合| 久久视频一区| 久久久久88色偷偷免费| 日韩午夜免费| 亚洲国产色一区| 雨宫琴音一区二区在线| 国产在线一区二区三区四区 | 国产日本欧美一区二区三区在线| 国产精品久久| 欧美午夜寂寞影院| 欧美日韩亚洲一区二区三区四区| 欧美激情国产日韩| 欧美成人午夜免费视在线看片| 亚洲专区一区| 亚洲国产精品成人久久综合一区| 韩国三级电影久久久久久| 国产亚洲一区在线播放| 国产一区日韩二区欧美三区| 国产视频亚洲精品| 国产亚洲一区二区在线观看| 国产资源精品在线观看| 国内成+人亚洲| 欧美午夜电影在线| 国产精品爱啪在线线免费观看|