最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

golang如何判斷文件是否存在

 更新時(shí)間:2024年11月26日 11:35:20   作者:apocelipes  
判斷一個(gè)文件是否存在是一個(gè)相當(dāng)常見(jiàn)的需求,在golang中也有多種方案實(shí)現(xiàn)這一功能,下面就跟隨小編一起學(xué)習(xí)一下具體的實(shí)現(xiàn)方法吧

判斷一個(gè)文件是否存在是一個(gè)相當(dāng)常見(jiàn)的需求,在golang中也有多種方案實(shí)現(xiàn)這一功能。

現(xiàn)在我們介紹其中兩種最常用也是最簡(jiǎn)單的實(shí)現(xiàn),第一種將是跨平臺(tái)通用的,而第二種則在POSIX平臺(tái)上通用。

跨平臺(tái)實(shí)現(xiàn)

跨平臺(tái)實(shí)現(xiàn)的思路很簡(jiǎn)單,如果某個(gè)文件不存在,那么使用os.Lstat就一定會(huì)返回error,只要判斷error是否代表文件不存在即可。

也許你注意到了有些代碼會(huì)使用os.Open來(lái)完成上述工作,不過(guò)最好不要這么做,因?yàn)殡m然兩者完成的功能沒(méi)有區(qū)別,但open和stat的調(diào)用開(kāi)銷(xiāo)是不同的,后者要小于前者,而且對(duì)于判斷文件是否存在,檢查它的元數(shù)據(jù)要比直接嘗試打開(kāi)它更加合理。

那么來(lái)看看實(shí)現(xiàn)的代碼:

func FileExist(path string) bool {
  _, err := os.Lstat(path)
  return !os.IsNotExist(err)
}

代碼很簡(jiǎn)單,對(duì)于Windows/Linux/MacOS等是通用的,一般沒(méi)有特殊需求我也比較推薦這種實(shí)現(xiàn)。

POSIX平臺(tái)實(shí)現(xiàn)

如果你的程序是面向POSIX平臺(tái)的(例如UNIX、Linux等),那么還有一種更簡(jiǎn)單的方案——syscall.Access。

syscall.Access提供了用戶檢查文件元信息的手段,通常它被用來(lái)檢查文件權(quán)限以及文件的存在性。

通過(guò)使用syscall.F_OK標(biāo)志檢查文件,如果不存在則會(huì)返回和os.Lstat一樣的error:

func FileExist(path string) bool {
  err := syscall.Access(path, syscall.F_OK)
  return !os.IsNotExist(err)
}

這種實(shí)現(xiàn)的最大優(yōu)勢(shì)在于它簡(jiǎn)單而直觀,但是它無(wú)法在Windows上使用。

一些提示

首先當(dāng)我們的FileExist返回true時(shí),其實(shí)文件并不一定存在。

當(dāng)我們對(duì)目標(biāo)path中的某一部分沒(méi)有可讀權(quán)限時(shí),os.Lstatsyscall.Access同樣會(huì)返回error,不過(guò)這個(gè)error不會(huì)讓os.IsNotExist返回true。

當(dāng)文件不存在而你對(duì)文件所在的目錄或者它的上層目錄沒(méi)有訪問(wèn)權(quán)限時(shí),FileExist依舊會(huì)返回true,bug就在這時(shí)發(fā)生了。所以重要的一點(diǎn)是在判斷文件是否存在前應(yīng)該先判斷自己對(duì)文件及其路徑是否有訪問(wèn)權(quán)限。

其次syscall.Access只會(huì)使用運(yùn)行程序的用戶的uid和gid,這會(huì)導(dǎo)致setuid之類(lèi)的權(quán)限失效,通常來(lái)說(shuō)這是沒(méi)什么問(wèn)題的,然而posix平臺(tái)上一般都會(huì)考慮euid和egid,因此你可能需要使用syscall.Faccessat做代替。你需要在深思熟慮后使用合適的系統(tǒng)調(diào)用。

性能測(cè)試

最后我們看看兩個(gè)方案的性能,我們以os.Open做為基準(zhǔn),分別測(cè)試先文件存在和不存在時(shí)的性能表現(xiàn):

func checkWithOpen(path string) bool {
	f, err := os.Open(path)
	if err != nil {
		return false
	}
	f.Close()
	return true
}

func checkWithLstat(path string) bool {
	_, err := os.Lstat(path)
	return !os.IsNotExist(err)
}

func checkWithAccess(path string) bool {
        err := syscall.Access(path, syscall.F_OK)
	return !os.IsNotExist(err)
}

func BenchmarkNotExists(b *testing.B) {
	for range b.N {
		checkWithOpen("/home/apocelipes/no-")
	}
}

func BenchmarkNotExistsLstat(b *testing.B) {
	for range b.N {
		checkWithLstat("/home/apocelipes/no-")
	}
}

func BenchmarkNotExistsAccess(b *testing.B) {
	for range b.N {
		checkWithAccess("/home/apocelipes/no-")
	}
}

func BenchmarkExists(b *testing.B) {
	for range b.N {
		checkWithOpen("/home/apocelipes/.zshrc")
	}
}

func BenchmarkExistsLstat(b *testing.B) {
	for range b.N {
		checkWithLstat("/home/apocelipes/.zshrc")
	}
}

func BenchmarkExistsAccess(b *testing.B) {
	for range b.N {
		checkWithAccess("/home/apocelipes/.zshrc")
	}
}

這是結(jié)果:

測(cè)試使用的文件系統(tǒng)類(lèi)型是XFS。

可以看到open是最慢的,lstat比access慢了16%左右。從結(jié)果里也可以看到lstat需要額外返回一個(gè)os.FileInfo結(jié)構(gòu)導(dǎo)致了額外的內(nèi)存分配,所以整體上速度更慢。

但考慮到跨平臺(tái)以及兼容性,使用os.Lstat是更常見(jiàn)的做法。

以上就是golang如何判斷文件是否存在的詳細(xì)內(nèi)容,更多關(guān)于go判斷文件是否存在的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 詳解Go語(yǔ)言如何解析帶注釋的json

    詳解Go語(yǔ)言如何解析帶注釋的json

    標(biāo)準(zhǔn)的json格式是不帶注釋?zhuān)怯袝r(shí)候?yàn)榱朔奖憷斫鈐son中各字段的含義,需要支持帶注釋的json,這篇文章主要介紹了Go語(yǔ)言解析帶注釋json的相關(guān)方法,希望對(duì)大家有所幫助
    2024-03-03
  • Go語(yǔ)言strconv包實(shí)現(xiàn)字符串和數(shù)值類(lèi)型的相互轉(zhuǎn)換

    Go語(yǔ)言strconv包實(shí)現(xiàn)字符串和數(shù)值類(lèi)型的相互轉(zhuǎn)換

    這篇文章主要介紹了Go語(yǔ)言strconv包實(shí)現(xiàn)字符串和數(shù)值類(lèi)型的相互轉(zhuǎn)換,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • Go語(yǔ)言使用goroutine及通道實(shí)現(xiàn)并發(fā)詳解

    Go語(yǔ)言使用goroutine及通道實(shí)現(xiàn)并發(fā)詳解

    這篇文章主要為大家介紹了Go語(yǔ)言使用goroutine及通道實(shí)現(xiàn)并發(fā)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • Golang Gorm 更新字段save、update、updates

    Golang Gorm 更新字段save、update、updates

    在gorm中,批量更新操作可以通過(guò)使用Update方法來(lái)實(shí)現(xiàn),本文主要介紹了Golang Gorm 更新字段save、update、updates,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-12-12
  • Go部署多環(huán)境開(kāi)發(fā)的項(xiàng)目實(shí)戰(zhàn)

    Go部署多環(huán)境開(kāi)發(fā)的項(xiàng)目實(shí)戰(zhàn)

    在 Go 項(xiàng)目的開(kāi)發(fā)過(guò)程中,能夠在不同的環(huán)境(如開(kāi)發(fā)、測(cè)試、生產(chǎn))中進(jìn)行靈活部署是至關(guān)重要的,不同環(huán)境通常需要不同的配置,下面就來(lái)詳細(xì)的介紹一下Go部署多環(huán)境
    2026-02-02
  • 淺談go中defer的一個(gè)隱藏功能

    淺談go中defer的一個(gè)隱藏功能

    這篇文章主要介紹了淺談go中defer的一個(gè)隱藏功能,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • golang中包無(wú)法引入問(wèn)題解決

    golang中包無(wú)法引入問(wèn)題解決

    本文主要介紹了golang中包無(wú)法引入問(wèn)題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • Go 并發(fā)實(shí)現(xiàn)協(xié)程同步的多種解決方法

    Go 并發(fā)實(shí)現(xiàn)協(xié)程同步的多種解決方法

    這篇文章主要介紹了Go 并發(fā)——實(shí)現(xiàn)協(xié)程同步的多種解決方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-08-08
  • 如何使用Go語(yǔ)言實(shí)現(xiàn)遠(yuǎn)程執(zhí)行命令

    如何使用Go語(yǔ)言實(shí)現(xiàn)遠(yuǎn)程執(zhí)行命令

    遠(yuǎn)程執(zhí)行命令最常用的方法就是利用SSH協(xié)議,將命令發(fā)送到遠(yuǎn)程機(jī)器上執(zhí)行,并獲取返回結(jié)果。本文將介紹如何使用Go語(yǔ)言實(shí)現(xiàn)遠(yuǎn)程執(zhí)行命令。下面一起來(lái)看看。
    2016-08-08
  • 詳解Go hash算法的支持

    詳解Go hash算法的支持

    這篇文章主要介紹了詳解Go hash算法的支持,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-09-09

最新評(píng)論

北票市| 云林县| 井研县| 揭阳市| 紫云| 绥中县| 油尖旺区| 上犹县| 伊金霍洛旗| 合水县| 恩平市| 芦溪县| 宣威市| 公安县| 阿拉善左旗| 怀安县| 田阳县| 大连市| 双牌县| 交城县| 盖州市| 鄄城县| 信阳市| 桂林市| 玉树县| 横山县| 宁强县| 芦山县| 保靖县| 遂溪县| 枞阳县| 云安县| 仁化县| 安国市| 澎湖县| 南阳市| 宁乡县| 朝阳县| 湘潭市| 霍城县| 涟源市|