模块课程(3/5)
`io` 和 `os`:文件和流
Go 中的读写文件和流围绕两个互补的包:os(打开、创建、元数据、进程)和 io(抽象任何字节源的 Reader/Writer 接口)。
读写文件:快捷方式
对于小文件或配置文件,一次调用就足够了:
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 打开文件并关闭它:
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:通用接口
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 也是如此。
// 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 开始:
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 ,您就可以传递它们。
fmt.Fprintln(os.Stderr, "log diagnostico")
io.Copy(os.Stdout, os.Stdin) // echo练习
打印第一个命令行参数 (os.Args[1])。如果丢失,则打印“manca argomento”并返回。
3 次尝试后可用的解决方案
使用 os.WriteFile (权限 0644)将字符串“ciao”写入文件“out.txt”。处理错误。
3 次尝试后可用的解决方案
os.Args 中程序名称的索引是什么?
fmt.Println(os.Args[???])