GoLang OS包以及File類型詳細(xì)講解
一、OS包的作用
os包中的API主要可以幫助我們使用操作系統(tǒng)中的文件系統(tǒng)、權(quán)限系統(tǒng)、環(huán)境變量、系統(tǒng)進(jìn)程,以及系統(tǒng)信號。
對于類Unix的操作系統(tǒng),其中的一切都可以被看作文件。因此可以利用os.File
類型操作的東西很多。
本篇文章把os.File
類型應(yīng)用于常規(guī)的文件。
二、os.File類型實(shí)現(xiàn)了哪些io包的接口
os.File
擁有的都是指針方法,所以除了空接口以外,它本身沒有實(shí)現(xiàn)任何接口。而它的指針類型則實(shí)現(xiàn)了很多io代碼包中的接口。
*os.File
實(shí)現(xiàn)了io包中三個最核心的簡單接口:io.Reader
、io.Writer
、io.Closer
;*os.File
還實(shí)現(xiàn)了另外三個簡單接口:io.ReaderAt
、io.Seeker
、io.WriterAt
;- 由于
*os.File
實(shí)現(xiàn)了上面六個簡單接口,所以它順便實(shí)現(xiàn)了io包中9個擴(kuò)展接口中的7個:io.ReadWriter
、io.ReadCloser
、io.ReadSeeker
、io.ReadWriteCloser
、io.ReadWriteSeeker
、io.WriteCloser
、io.WriteSeeker
。
由于·*os.File
沒有實(shí)現(xiàn)簡單接口io.ByteReader
和io.RuneReader
,所以它沒有實(shí)現(xiàn)它沒有實(shí)現(xiàn)作為它兩者的擴(kuò)展接口:io.ByteScanner
和io.RuneScanner
。
所以,os.File
可以讀寫文件,并讀取和設(shè)定下一次讀寫的起始索引位置。還可以對文件進(jìn)行關(guān)閉。但是,并不能專門地讀取文件的下一個字節(jié),或者寫一個Unicode字符,也不能進(jìn)行任何的讀回退操作。
三、創(chuàng)建os.File類型的指針類型
在os包中,有這樣幾個函數(shù):Create、NewFile、Open和OpenFile。
3.1 os.Create
os.Create
函數(shù)用于根據(jù)指定的路徑創(chuàng)建一個新的文件。
使用這個函數(shù)創(chuàng)建的文件,對于操作系統(tǒng)中的所有用戶來說,都是可以讀和寫的。
- 如果在我們給予
os.Create
函數(shù)的路徑之上,已經(jīng)存在一個文件,那么該函數(shù)會清空現(xiàn)有文件中的全部內(nèi)容,然后再把它作為第一個結(jié)果值返回; - 如果給定的路徑的某一級父目錄并不存在,該函數(shù)就會返回一個
*os.PathError
類型的錯誤值,以表示“不存在的文件或目錄“。
3.2 os.NewFile
該函數(shù)在被調(diào)用的時候,需要接受一個代表文件描述符的uintptr類型的值,以及一個用于表示文件名的字符值。
- 如果給定的文件描述符不是有效的,那么函數(shù)將返回nil。否則,它將會返回一個代表了相應(yīng)文件的File值;
這個函數(shù)的功能并不是創(chuàng)建一個新的文件,而是依據(jù)一個已經(jīng)存在的文件描述符,來新建一個包裝了該文件的File值。
3.3 os.Open
os.Open
函數(shù)會打開一個文件并返回包裝了該文件的File值。然而,該函數(shù)只能以只讀模式打開文件。
換句話說,我們只能從該函數(shù)返回的File值中讀取內(nèi)容,而不能向它寫入任何內(nèi)容。
如果調(diào)用它的任何一個寫入方法,都會得到一個表示“壞的文件描述符”的錯誤值。
os.File
類型有一個指針方法Fd,它在被調(diào)用之后將會返回一個uintptr 類型的值,這個值就代表了當(dāng)前的File值所持有的那個文件描述符。
3.4 os.OpenFile
os.OpenFile
其實(shí)是os.Open
、os.Create
函數(shù)的底層支持,它最為靈活。
這個函數(shù)有3個參數(shù):
- name:文件路徑;
- flag:需要施加在文件描述符之上的模式;比如,只讀模式(由
os.O_RDONLY
)。操作模式 - perm:代表的也是模式,類型是
os.FileMode
,是一個基于uint32類型的再定義類型。權(quán)限模式。
操作模式限定了文件的方式,權(quán)限模式控制文件的訪問權(quán)限。
四、os.File值的操作模式有哪些
針對File值的操作模式主要有:只讀模式、只寫模式和讀寫模式。
- 只讀模式:
os.O_RDONLY
- 只寫模式:
os.O_WRONLY
- 讀寫模式:
os.O_RDWR
更多的操作模式:
os.O_APPEDN
:寫內(nèi)容是,追加在現(xiàn)有內(nèi)容的后面;os.O_CREATE
:當(dāng)給定路徑上的文件不存在時,創(chuàng)建一個新文件;os.O_EXCL
:需要和os.O_CREATE
一同使用,表示給定的路徑上不能有存在的文件。os.O_SYNC
:在打開文件之上實(shí)施同步I/O。它會保證讀寫的內(nèi)容總會與硬盤上的數(shù)據(jù)保持同步。os.O_TRUNC
:如果文件已存在,并且是常規(guī)的文件,那么就先清空其中已存在的任何內(nèi)容。
多個操作模式是通過按位操作符|
組合起來的。
func Create(name string) (*File, error) { return OpenFile(name, O_RDWR|O_CREATE|O_TRUNC, 0666) }
func Open(name string) (*File, error) { return OpenFile(name, O_RDONLY, 0) }
五、os.OpenFile的第三個表示模式的參數(shù)
os.OpenFile
函數(shù)的第三個參數(shù)perm代表的是權(quán)限模式,它的類型是os.FileMode
。實(shí)際上,os.FileMode
能夠代表的不僅是權(quán)限模式,還可以代表文件模式(也可以稱為文件種類)。
os.FileMode
是基于uint32類型的再定義類型,包含23個比特位,在這23個比特位,每個比特位都有特定的含義。
- 如果在最高比特位的二進(jìn)制數(shù)是1,該文件模式就等同于
os.ModeDir
,也就是說相應(yīng)的文件是一個目錄。 - 如果在第26位比特位的二進(jìn)制數(shù)是1,該文件模式就等同于
os.ModeNamedPipe
,也就是說該文件是一個命名管道。
os.FileMode
只有最低9個比特位才用于表示文件的權(quán)限。
拿os.FileMode
類型的值與os.ModePerm
常量(值為0777)做按位與操作,得到的值就表示對應(yīng)的權(quán)限模式。
這9個比特位,3個為一組,共3組。從高到低,分別表示:文件所有者(創(chuàng)建文件的那個用戶)、文件所屬的用戶組、用戶對該文件的訪問權(quán)限。而對于每個組,其中的3個比特位從高到低分別表示:讀權(quán)限、寫權(quán)限、執(zhí)行權(quán)限。
某個比特位上是1,表示相應(yīng)的權(quán)限開啟,否則,就表示相應(yīng)的權(quán)限關(guān)閉。
- 八進(jìn)制整數(shù)0777就表示:操作系統(tǒng)中的所有用戶都對當(dāng)前的文件有讀、寫和執(zhí)行的權(quán)限;
- 而八進(jìn)制整數(shù)0666則表示:所有用戶都對當(dāng)前文件有讀和寫的權(quán)限,但都沒有執(zhí)行的權(quán)限。
但要注意,只有在新建文件的時候,這里的第三個參數(shù)值才是有效的。在其他情況下,即使我們設(shè)置了此參數(shù),也不會對目標(biāo)文件產(chǎn)生任何的影響。
到此這篇關(guān)于GoLang OS包以及File類型詳細(xì)講解的文章就介紹到這了,更多相關(guān)Go os包的File內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go中的函數(shù)選項(xiàng)模式(Functional Options Pattern)詳解
在 Go 語言中,函數(shù)選項(xiàng)模式是一種優(yōu)雅的設(shè)計(jì)模式,用于處理函數(shù)的可選參數(shù),本文將對其進(jìn)行講解,準(zhǔn)備好了嗎,快跟隨著本文一探究竟吧2023-06-06一文掌握Golang的panic和recover實(shí)戰(zhàn)
Go語言中,異常處理通常依賴error返回值,本文將通過示例展示如何在Go語言中正確使用recover來處理panic異常,防止程序直接崩潰,感興趣的朋友跟隨小編一起看看吧2024-09-09利用Go Plugin實(shí)現(xiàn)插件化編程的簡單方法
Golang官方提供了plugin模塊,該模塊可以支持插件開,下面這篇文章主要給大家介紹了關(guān)于如何利用Go Plugin實(shí)現(xiàn)插件化編程的相關(guān)資料,需要的朋友可以參考下2021-10-10golang中l(wèi)og包自定義輸出日志格式與寫入到文件
這篇文章主要給大家介紹了關(guān)于golang中l(wèi)og包自定義輸出日志格式與寫入到文件的相關(guān)資料,日志輸出在任何項(xiàng)目中都極其重要,是有助于后續(xù)我們排查解決程序BUG,需要的朋友可以參考下2023-06-06