Skip to content

第 17 章:文件操作

17.1 读取文件

读取整个文件

使用 os.ReadFile 函数可以一次性读取整个文件的内容:

go
package main

import (
    "fmt"
    "os"
)

func main() {
    data, err := os.ReadFile("example.txt")
    if err != nil {
        fmt.Println("Error reading file:", err)
        return
    }
    fmt.Println(string(data))
}

逐行读取文件

使用 bufio 包可以逐行读取文件:

go
package main

import (
    "bufio"
    "fmt"
    "os"
)

func main() {
    file, err := os.Open("example.txt")
    if err != nil {
        fmt.Println("Error opening file:", err)
        return
    }
    defer file.Close()
    
    scanner := bufio.NewScanner(file)
    for scanner.Scan() {
        fmt.Println(scanner.Text())
    }
    
    if err := scanner.Err(); err != nil {
        fmt.Println("Error scanning file:", err)
    }
}

17.2 写入文件

写入整个文件

使用 os.WriteFile 函数可以一次性写入整个文件:

go
package main

import (
    "fmt"
    "os"
)

func main() {
    data := []byte("Hello, World!\nThis is a test file.")
    err := os.WriteFile("output.txt", data, 0644)
    if err != nil {
        fmt.Println("Error writing file:", err)
        return
    }
    fmt.Println("File written successfully")
}

追加写入文件

使用 os.OpenFile 函数可以以追加模式打开文件:

go
package main

import (
    "fmt"
    "os"
)

func main() {
    file, err := os.OpenFile("output.txt", os.O_APPEND|os.O_WRONLY|os.O_CREATE, 0644)
    if err != nil {
        fmt.Println("Error opening file:", err)
        return
    }
    defer file.Close()
    
    data := []byte("\nThis is an appended line.")
    _, err = file.Write(data)
    if err != nil {
        fmt.Println("Error writing file:", err)
        return
    }
    fmt.Println("File appended successfully")
}

17.3 复制、删除、遍历文件

复制文件

使用 io.Copy 函数可以复制文件:

go
package main

import (
    "fmt"
    "io"
    "os"
)

func copyFile(src, dst string) error {
    source, err := os.Open(src)
    if err != nil {
        return err
    }
    defer source.Close()
    
    destination, err := os.Create(dst)
    if err != nil {
        return err
    }
    defer destination.Close()
    
    _, err = io.Copy(destination, source)
    return err
}

func main() {
    err := copyFile("source.txt", "destination.txt")
    if err != nil {
        fmt.Println("Error copying file:", err)
        return
    }
    fmt.Println("File copied successfully")
}

删除文件

使用 os.Remove 函数可以删除文件:

go
package main

import (
    "fmt"
    "os"
)

func main() {
    err := os.Remove("file.txt")
    if err != nil {
        fmt.Println("Error deleting file:", err)
        return
    }
    fmt.Println("File deleted successfully")
}

遍历目录

使用 os.ReadDir 函数可以遍历目录:

go
package main

import (
    "fmt"
    "os"
)

func main() {
    entries, err := os.ReadDir(".")
    if err != nil {
        fmt.Println("Error reading directory:", err)
        return
    }
    
    for _, entry := range entries {
        if entry.IsDir() {
            fmt.Printf("%s/ (directory)\n", entry.Name())
        } else {
            fmt.Printf("%s (file)\n", entry.Name())
        }
    }
}

17.4 JSON 序列化与反序列化

JSON 序列化

使用 encoding/json 包可以将结构体序列化为 JSON:

go
package main

import (
    "encoding/json"
    "fmt"
    "os"
)

type Person struct {
    Name string `json:"name"`
    Age  int    `json:"age"`
    City string `json:"city"`
}

func main() {
    person := Person{
        Name: "Alice",
        Age:  25,
        City: "Beijing",
    }
    
    data, err := json.MarshalIndent(person, "", "  ")
    if err != nil {
        fmt.Println("Error marshaling JSON:", err)
        return
    }
    
    err = os.WriteFile("person.json", data, 0644)
    if err != nil {
        fmt.Println("Error writing file:", err)
        return
    }
    fmt.Println("JSON written successfully")
}

JSON 反序列化

使用 encoding/json 包可以将 JSON 反序列化为结构体:

go
package main

import (
    "encoding/json"
    "fmt"
    "os"
)

type Person struct {
    Name string `json:"name"`
    Age  int    `json:"age"`
    City string `json:"city"`
}

func main() {
    data, err := os.ReadFile("person.json")
    if err != nil {
        fmt.Println("Error reading file:", err)
        return
    }
    
    var person Person
    err = json.Unmarshal(data, &person)
    if err != nil {
        fmt.Println("Error unmarshaling JSON:", err)
        return
    }
    
    fmt.Printf("Name: %s\nAge: %d\nCity: %s\n", person.Name, person.Age, person.City)
}

© 2026 编程马·菜鸟教程 版权所有