首页
/
每日頭條
/
科技
/
go基本程序詳解
go基本程序詳解
更新时间:2024-09-27 19:24:16

go基本程序詳解?在Go語言中,文件操作的大多數函數都在os包裡面,文件的信息包括文件名、文件大小、修改權限、修改時間等,現在小編就來說說關于go基本程序詳解?下面内容希望能幫助到你,我們來一起看看吧!

go基本程序詳解(Go學習二十四:文件操作)1

go基本程序詳解

1.介紹

在Go語言中,文件操作的大多數函數都在os包裡面,文件的信息包括文件名、文件大小、修改權限、修改時間等。

1.1 文件接口屬性(fileInfo)

type FileInfo interface { Name() string // 文件名 Size() int64 // 文件大小 Mode() FileMode // 修改權限 ModTime() time.Time // 最後修改時間 IsDir() bool // 判斷是否是目錄 Sys() interface{} // 文件的詳細信息,獲取的值是*syscall.Stat_t類型 }

1.2 文件信息結構體(fileStat)

type fileStat struct { name string size int64 mode FileMode modTime time.Time sys syscall.Stat_t }

1.fileStat結構體的常用方法彙總

方法名 描述 Name() string 返回文件名 IsDir() bool 判斷是否是目錄 Size() int64 返回文件大小 Mode() FileMode 返回文件權限 ModTime() time.Time 文件的最後修改時間 Sys() interface{} 文件的詳細信息,獲取的值是*syscall.Stat_t類型

2.使用示例

package main import ( "fmt" "os" ) func main(){ fp := "./public/test1.txt" fileInfo, err := os.Stat(fp) if err != nil { fmt.Println(err.Error()) return } fmt.Printf("類型: %T\n",fileInfo) fmt.Printf("文件名: %v\n",fileInfo.Name()) fmt.Printf("文件大小: %v\n",fileInfo.Size()) fmt.Printf("是否為目錄: %v\n",fileInfo.IsDir()) fmt.Printf("文件權限: %v\n",fileInfo.Mode()) fmt.Printf("文件最後修改的時間: %v\n",fileInfo.ModTime()) } /**輸出 類型: *os.fileStat 文件名: test1.txt 文件大小: 11 是否為目錄: false 文件權限: -rw-r--r-- 文件最後修改的時間: 2021-01-15 16:29:53.816034553 0800 CST sys: &{Dev:16777220 Mode:33188 Nlink:1 Ino:15440327 Uid:501 Gid:20 Rdev:0 Pad_cgo_0:[0 0 0 0] Atimespec:{Sec:1610699394 Nsec:591237565} Mtimespec:{Sec:1610699393 Nsec:816034553} Ctimespec:{Sec:1610699393 Nsec:816034553} Birthtimespec:{Sec:1610611801 Nsec:544367649} Size:11 Blocks:8 Blksize:4096 Flags:0 Gen:0 Lspare:0 Qspare:[0 0]} */

2.求路徑方法2.1 方法列表

方法的所屬包: path/filepath

方法名 描述 Isabs(path string) bool 判斷是否是絕對路徑 rel(basepath, targpath string) (string, error) 返回一個相對于basepath的路徑 Abs(path string) (string, error) 返回絕對路徑 Join(elem ...string) string 拼接路徑

2.2 使用示例

package main import ( "fmt" "path" "path/filepath" ) func main(){ basePath := "/Users/hui/Project/Go/src/study" fp1 := "./public/test1.txt" fp2 := "/Users/hui/Project/Go/src/study/public/static/test2.txt" fmt.Printf("是絕對路徑?: %t\n",filepath.IsAbs(fp1)) // 相對路徑 rel, err := filepath.Rel(basePath, fp2) if err != nil { fmt.Println(err.Error()) } fmt.Printf("fp1相對fp2的路徑?: %v\n",rel) // 絕對路徑 abs, err := filepath.Abs(fp1) if err != nil { fmt.Println(err.Error()) } fmt.Printf("fp1的絕對路徑?: %s\n",abs) // 拼接路徑 fmt.Printf("拼接路徑1: %s \n",path.Join("/home/Item","go","study")) fmt.Printf("拼接路徑2: %s \n",path.Join("/home/圖片","美女","beauty.jpg")) } /** 輸出 是絕對路徑?: false fp1相對fp2的路徑?: public/static/test2.txt fp1的絕對路徑?: /Users/hui/Project/Go/src/study/public/test1.txt 拼接路徑1: /home/Item/go/study 拼接路徑2: /home/圖片/美女/beauty.jpg */

3.目錄操作3.1 創建目錄1.方法列表

方法 描述 os.Mkdir(name string, perm FileMode) error 創建名稱為name的目錄,權限設置是perm os.MkdirAll(path string, perm FileMode) error 根據path創建多級子目錄

2.使用示例

package main import ( "fmt" "os" ) func main(){ dirName := "./img" // 創建目錄,并分配權限 err := os.Mkdir(dirName, os.ModePerm) if err != nil { fmt.Println(err.Error()) } fmt.Println( dirName " 創建成功!") // 創建多級目錄 dirName2 := "./public/static/css" err = os.MkdirAll(dirName2,os.ModePerm) if err != nil { fmt.Println(err.Error()) } fmt.Println( dirName2 " 創建成功!") }

3.2 判斷目錄是否存在

// 判斷文件或者目錄是否存在 func pathIsExist(pathName string) (bool,error) { // 獲取文件或目錄信息 _, err := os.Stat(pathName) // 如果文件或目錄存在,則err== nil if err == nil { return true, nil } // 使用os.IsNotExist()判斷返回的錯誤類型是否為true,true:說明文件或文件夾不存在 if os.IsNotExist(err) { return false,nil } // 如果錯誤類型為其它,則不确定是否在存在 return false,err }

3.3 删除目錄1.方法列表

方法 描述 os.Remove(name string) error 删除名稱為name的目錄,當目錄下有文件或者其他目錄會出錯 os.RemoveAll(path string) error 根據path删除多級子目錄

2.使用示例

package main import ( "fmt" "os" ) func main(){ // 删除目錄 err := os.Remove("./file") if err != nil { fmt.Println("Remove-> 删除失敗: " err.Error()) } else { fmt.Println("Remove-> 删除成功!" ) } // 删除多級子目錄 err2 := os.RemoveAll("./file/static") if err2 != nil { fmt.Println("RemoveAll-> 删除失敗: " err2.Error()) } else { fmt.Println("RemoveAll-> 删除成功!" ) } }

4.文件操作4.1 創建文件

os.Create()創建文件,如果文件存在,會将其覆蓋。os.Create()本質上調用的是OpenFile,源碼如下:

func Create(name string) (*File, error) { return OpenFile(name, O_RDWR|O_CREATE|O_TRUNC, 0666) }

使用示例

package main import ( "fmt" "os" ) func main(){ fileName := "./file/a.txt" //如果文件存在,則會覆蓋 create, err := os.Create(fileName) if err != nil { fmt.Println("創建失敗: " err.Error()) return } fmt.Printf("創建成功! %v\n",create) }

4.2 打開和關閉文件1.方法列表

方法名 描述 Open(name string) (*File, error) 隻讀模式打開文件,本質上調用的是OpenFile OpenFile(name string, flag int, perm FileMode) (*File, error) 打開文件,可以傳入模式和權限

2.OpenFile入參介紹

flag值 代表的模式 O_RDONLY 隻讀模式 O_WRONLY 隻寫模式 O_RDWR 讀寫模式 O_APPEND 追加模式 O_CREATE 文件不存在,則創建 O_EXCL 和O_CREATE配合使用,文件必須不存在 O_SYNC 打開文件用于同步I/O O_TRUNC 如果可能,打開時清空文件

3.使用示例

package main import ( "fmt" "os" ) func main(){ // 該文件不存在 fileName := "./public/test.txt" file1, err := os.Open(fileName) if err != nil { fmt.Printf("os.Open 打開文件失敗,err:%s \n" , err.Error()) } else { fmt.Printf("os.Open 打開文件成功,open:%v \n" , file1) // 關閉文件 defer file1.Close() } // 文件不存在,則會創建文件 file2, err1 := os.OpenFile(fileName,os.O_CREATE,os.ModePerm) if err1 != nil { fmt.Printf("os.OpenFile 打開文件失敗,err:%s \n" , err1.Error()) } else { fmt.Printf("os.OpenFile 打開文件成功,open:%v \n" , file2) // 關閉文件 defer file2.Close() } } /**輸出 os.Open 打開文件失敗,err:open ./public/test.txt: no such file or directory os.OpenFile 打開文件成功,open:&{0xc0000b0120} */

4.3 讀取文件

讀取文件步驟: 打開文件(Open) 、讀取文件(Read)、關閉文件(Close)

package main import ( "fmt" "os" ) func main(){ fileName := "./public/test.txt" file1, err := os.Open(fileName) if err != nil { fmt.Printf("os.Open 打開文件失敗,err:%s \n" , err.Error()) return } // 定義一個變量存儲讀取的内容 b := make([]byte,1024) // 讀取文件 for { read, _ := file1.Read(b) if read == 0 { break } } fmt.Printf("讀取内容: %s \n",b) // 關閉文件 _ = file1.Close() } // 輸出: 讀取内容: Hello Word! 您好,世界!

4.4 寫入文件

寫入文件步驟: 打開文件(OpenFile) 、寫入文件(Write)、關閉文件(Close)

package main import ( "fmt" "os" ) func main(){ fileName := "./public/hello.txt" // 讀寫|創建|追加的模式 模式打開文件 file1, err := os.OpenFile(fileName,os.O_RDWR | os.O_CREATE | os.O_APPEND ,os.ModePerm ) if err != nil { fmt.Printf("os.OpenFile 打開文件失敗,err:%s \n" , err.Error()) return } // 寫入文件 write, err := file1.Write([]byte("Go! Go! Let's Go!! 漢字 \n")) if err != nil { fmt.Printf("寫入失敗: %s \n",err.Error()) } fmt.Printf("寫入字節數: %d \n",write) // 關閉文件 _ = file1.Close() }

4.5 複制文件

Go語言提供了io.copy()方法,用來複制文件。

package main import ( "fmt" "io" "os" ) func main(){ // 把fileA文件複制給fileB fileA := "./public/hello.txt" fileB := "./public/new.txt" // 打開源文件 sourceA, err := os.Open(fileA) if err != nil { fmt.Printf("os.Open 打開文件失敗,err:%s \n" , err.Error()) return } // 關閉文件A defer sourceA.Close() // 打開新文件 targetB, err := os.Create(fileB) if err != nil { fmt.Printf("os.Create 創建新文件失敗,err:%s \n" , err.Error()) return } // 關閉文件B defer targetB.Close() // 把fileA文件複制給fileB written, err := io.Copy(targetB, sourceA) if err != nil { fmt.Printf("文件複制失敗,err:%s \n" , err.Error()) return } fmt.Printf("文件複制成功: %d \n" ,written) }

4.6 删除文件

同 3.3 删除目錄

微信搜索【猿碼記】獲取最新文章信息。

,
Comments
Welcome to tft每日頭條 comments! Please keep conversations courteous and on-topic. To fosterproductive and respectful conversations, you may see comments from our Community Managers.
Sign up to post
Sort by
Show More Comments
推荐阅读
小米負一屏全新功能
小米負一屏全新功能
現在使用小米手機的小夥伴可是越來越多,很多小夥伴都因為小米手機的高性價比而成為了米粉。那大家在用了這麼久的小米手機中,對這個非常強大的“負一屏”了解嗎?他可是非常實用的呢,今天就讓我們一起來看看吧~一、添加頭部背景圖在我們小米手機“負一屏”...
2024-09-27
lol為什麼不能轉區了
lol為什麼不能轉區了
LOL轉區系統再次開啟,這已經是第六期了,這次活動不需要什麼資格申請了,所有的召喚師隻需要根據官網上的要求,填寫好個人資料并且支付199元,玩家們可以直接轉到自己想要去的區服了。不過有兩個比較奇怪的地方,第一個是教育網隻出不進,第二個是艾歐...
2024-09-27
音樂播放器安裝包官方完整版
音樂播放器安裝包官方完整版
首先在此給各位網友道個歉,上一篇“下載軟件的興衰史,是技術演變史還是利益圈錢史?”由于輸入錯誤把veryCD網站成立時間打錯了,這裡更正一下“2003年veryCD網站成立”,多謝各位網友指出錯誤,西北以東在此拜謝!!今天跟着我一起聊聊音樂...
2024-09-27
老智能機刷什麼系統最流暢
老智能機刷什麼系統最流暢
年輕,激情而有活力,喜歡嘗試新鮮的東西,熱愛折騰。不折騰無青春。讓我們一起來細數那些年咱們玩過的機,刷過的系統。【Windows系統篇】XP系統(經典、穩定),老式電腦最佳選擇,一起回顧一下熟悉的界面,經典的開機音樂Windows7系統,穩...
2024-09-27
win7系統備份步驟
win7系統備份步驟
1.打開控制面闆,“備份和還原”,選擇設置備份。2.彈出提示,耐心等待完成。3.選擇備份位置,任何超過1G的磁盤以及DVD刻錄機會顯示在此。4.提示備份内容,可以讓Windows選擇或自行選擇。5.點下一步後出現備份信息,點擊保存設置并運行...
2024-09-27
Copyright 2023-2024 - www.tftnews.com All Rights Reserved