跳转到主要内容
模块 8 · 第 3 课(共 5)课程中的38/50~14 min
模块课程(3/5)

`io` 和 `os`:文件和流

Go 中的读写文件和流围绕两个互补的包:os(打开、创建、元数据、进程)和 io(抽象任何字节源的 Reader/Writer 接口)。

读写文件:快捷方式

对于小文件或配置文件,一次调用就足够了:

Go
data, err := os.ReadFile("input.txt")        // returns []byte
if err != nil {
    return err
}
fmt.Println(string(data))

err = os.WriteFile("out.txt", []byte("ciao"), 0644)

os.ReadFile 打开,将所有内容读入内存并关闭。完美可达几MB;除此之外,流媒体更好。

打开文件进行流式传输

对于大文件或增量访问,请使用 defer 打开文件并关闭它:

Go
f, err := os.Open("big.txt")        // read-only
if err != nil {
    return err
}
defer f.Close()

buf := make([]byte, 4096)
for {
    n, err := f.Read(buf)
    if n > 0 {
        process(buf[:n])
    }
    if err == io.EOF {
        break
    }
    if err != nil {
        return err
    }
}

os.Open 以只读方式打开。要写入,请使用 os.Create (如果存在则截断)或 os.OpenFile(path, flag, perm) 以及 os.O_APPEND | os.O_CREATE | os.O_WRONLY 等标志。

io.Reader 和 io.Writer:通用接口

Go
type Reader interface { Read(p []byte) (n int, err error) }
type Writer interface { Write(p []byte) (n int, err error) }

无论标准库接受 io.Reader ,您都可以传递文件 (*os.File)、字符串 (strings.NewReader)、*bytes.Buffer、HTTP 响应 (resp.Body)、解压缩器... io.Writer 也是如此。

Go
// Copy from a Reader to a Writer (e.g. download → file).
n, err := io.Copy(dst, src)

io.Copy 是字节管道的主力:它正确处理缓冲和 EOF。 io.ReadAll(r) 将 EOF 之前的所有内容读取到 []byte 中。

os.Args:CLI 参数

os.Args 是一个字符串切片:索引 0 是程序名称,从实际参数的 1 开始:

Go
func main() {
    if len(os.Args) < 2 {
        fmt.Fprintln(os.Stderr, "uso: prog <nome>")
        os.Exit(1)
    }
    fmt.Println("ciao", os.Args[1])
}

对于更结构化的解析(标志、默认值、帮助),请使用 stdlib 中的 flag 包或外部库(如 cobra)。

os.Stdin、os.Stdout、os.Stderr

这是三个全局 *os.File:只要接受 io.Reader 或 io.Writer ,您就可以传递它们。

Go
fmt.Fprintln(os.Stderr, "log diagnostico")
io.Copy(os.Stdout, os.Stdin)  // echo

练习

锻炼#go.m8.l3.e1
尝试:0加载中...

打印第一个命令行参数 (os.Args[1])。如果丢失,则打印“manca argomento”并返回。

正在加载编辑器...

3 次尝试后可用的解决方案

锻炼#go.m8.l3.e2
尝试:0加载中...

使用 os.WriteFile (权限 0644)将字符串“ciao”写入文件“out.txt”。处理错误。

正在加载编辑器...

3 次尝试后可用的解决方案

Quiz#go.m8.l3.e3
准备好

os.Args 中程序名称的索引是什么?

Go
fmt.Println(os.Args[???])
答案选项