概述
在上一節的內容中,我們介紹了Go的反射,包括:reflect.TypeOf、reflect.ValueOf、reflect.Value等。在本節中,我們將介紹Go的文件操作。在Go語言中,文件是一個抽象的概念,表示的是一段連續的字節序列。文件操作主要包括:文件的創建、讀取、寫入、刪除,以及目錄的創建、刪除、文件遍歷等。Go語言提供了許多內置的函數和包,使得文件操作變得非常簡單和高效。
讀取文件
要讀取文件,需要先打開文件。打開文件可以使用os.Open()函數,該函數返回一個*os.File類型的文件對象,表示已經打開的文件。要讀取一個文件的內容,可以使用os包或bufio包提供的函數。
在下面的示例代碼中,我們首先使用os.Open()函數打開了文件test.txt。然后,我們使用bufio.NewScanner函數創建了一個Scanner對象scanner,并逐行讀取文件。如果文件讀取時發生了錯誤,可通過scanner.Err()函數獲取錯誤信息。
package main
import "os"
import "fmt"
import "bufio"
func main() {
// 打開文件
file, err := os.Open("test.txt")
if err != nil {
fmt.Println("Open failed: ", err)
return
}
defer file.Close()
// 逐行讀取文件
scanner := bufio.NewScanner(file)
for scanner.Scan() {
line := scanner.Text()
// 處理每一行數據
fmt.Println("line data: ", line)
}
if err := scanner.Err(); err != nil {
// 處理讀取錯誤
fmt.Println("Read failed: ", err)
}
}
寫入文件
要寫入文件,可以使用os包提供的Create()函數創建一個新文件,并使用Write()函數或WriteString()函數寫入數據。
在下面的示例代碼中,我們首先使用os.Create()函數創建了文件test.txt。然后,我們使用WriteString()函數寫入了字符串"Hello, World"。最后,我們通過defer語句關閉了文件,釋放了系統資源。
package main
import "os"
import "fmt"
func main() {
// 創建文件
file, err := os.Create("test.txt")
if err != nil {
fmt.Println("Create failed: ", err)
return
}
defer file.Close()
text := "Hello, World"
// 向文件中寫入字符串
_, err = file.WriteString(text)
if err != nil {
fmt.Println("Write failed: ", err)
}
}
在進行文件讀寫操作時,需要注意以下幾點:
1、打開文件后,一定要記得關閉文件,以釋放資源,可以使用defer語句來確保在函數結束時關閉文件。
2、在讀取或寫入文件時,需要檢查是否有錯誤發生,并進行適當的錯誤處理。
刪除文件
要刪除一個文件,可以使用os.Remove()函數。
package main
import "os"
import "fmt"
func main() {
err := os.Remove("test.txt")
if err != nil {
fmt.Println("Remove failed:", err)
} else {
fmt.Println("Remove success")
}
}
目錄操作
目錄的操作包括:創建目錄、刪除目錄、判斷目錄是否存在等。
在下面的示例代碼中,我們首先使用os.Mkdir()函數創建了一個名為test的新目錄。第一個參數是目錄的路徑,第二個參數是目錄的權限模式(0755表示擁有者具有讀、寫和執行權限,而組和其他用戶具有讀和執行權限)。接下來,我們通過os.Stat()函數判斷目錄是否存在。如果存在,則調用os.Remove()函數刪除剛剛創建的目錄。
package main
import "os"
import "fmt"
func main() {
// 創建目錄
err := os.Mkdir("test", 0755)
if err != nil {
fmt.Println("Mkdir failed:", err)
return
} else {
fmt.Println("Mkdir success")
}
// 判斷目錄是否存在
_ , err2 := os.Stat("test")
if err2 == nil {
// 刪除目錄
err = os.Remove("test")
if err != nil {
fmt.Println("Remove failed:", err)
} else {
fmt.Println("Remove success")
}
} else {
fmt.Println("Path not exist")
}
}
遍歷目錄下文件
在Go語言中,可以使用os包中的Readdir函數來讀取目錄的內容。Readdir函數返回一個[]os.DirEntry類型的切片,其中包含了目錄中所有文件和子目錄的信息。
在下面的示例代碼中,我們使用os.Open函數打開名為doc的目錄,并使用Readdir函數列出其中的所有文件。然后,通過遍歷files切片,可以打印出每個文件的名稱。注意:在使用Readdir函數時,傳入-1作為參數將返回所有的文件,包括隱藏文件。
package main
import "os"
import "fmt"
func main() {
// 打開目錄
dir, err := os.Open("doc")
if err != nil {
fmt.Println("Open failed:", err)
return
}
defer dir.Close()
// 讀取目錄
files, err := dir.Readdir(-1)
if err != nil {
fmt.Println("Readdir failed:", err)
} else {
// 遍歷目錄下文件
for _, file := range files {
fmt.Println(file.Name())
}
}
}