ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
[TOC] 包io提供I/O原语的基本接口。它的主要工作是将这些原语的现有实现(如包操作系统中的实现)包装到抽象功能的共享公共接口中,再加上一些其他相关的原语。 # 函数 ## ReadAll、ReadFull 读取 reader 的数据 ```go // ReadAll fmt.Println("----------ReadAll-------------") reader := strings.NewReader("jiaxzeng") b, err := io.ReadAll(reader) if err != nil { panic(err) } fmt.Printf("value is %v\n", string(b)) // ReadFull // 当buf没有读取满的时候,err:unexpected EOF。所以通过判断 n 是否为 0 来决定是否打印内容 fmt.Println("\n----------ReadFull-------------") reader = strings.NewReader("jiaxzeng") buf := make([]byte, 3) for { n, err := io.ReadFull(reader, buf) if n > 0 { fmt.Printf("value is %v, err is %v\n", string(buf[:n]), err) } else if err == io.EOF { break } } // 运行结果 // ----------ReadAll------------- // value is jiaxzeng // ----------ReadFull------------- // value is jia, err is <nil> // value is xze, err is <nil> // value is ng, err is unexpected EOF ``` ## WriteString WriteString 将字符串 s 的内容写入 w,w 接受一个字节切片。 ```go fmt.Println("\n----------WriteString-------------") if _, err = io.WriteString(os.Stdout, "jiaxzeng\n"); err != nil { panic(err) } // 运行结果 // ----------WriteString------------- // jiaxzeng ``` ## Copy 将副本从 src 复制到 dst,直到在 src 上到达 EOF 或发生错误 ```go fmt.Println("\n----------Copy-------------") reader = strings.NewReader("jiaxzeng\n") if _, err = io.Copy(os.Stdout, reader); err != nil { panic(err) } // 运行结果 // ----------Copy------------- // jiaxzeng ``` # Directories ## ReadAll ReadAll 从 r 读取直到出现错误或 EOF 并返回它读取的数据。 ```go fmt.Println("\n----------ReadAll-------------") reader = strings.NewReader("jiaxzeng") if b, err = ioutil.ReadAll(reader); err != nil { panic(err) } else { fmt.Printf("value is %v\n", string(b)) } // 运行结果 // ----------ReadAll------------- // value is jiaxzeng ``` ## ReadDir ReadDir 读取 dirname 命名的目录并返回 fs 的列表 ```go fmt.Println("\n----------ReadDir-------------") if fs, err := ioutil.ReadDir("."); err != nil { panic(err) } else { // for i := 0; i < len(fs); i++ { // fmt.Printf("fileName: %s, isDir: %t\n", fs[i].Name(), fs[i].IsDir()) // } for _, f := range fs { fmt.Printf("Name: %s, isDir: %t\n", f.Name(), f.IsDir()) } } // 运行结果 // ----------ReadDir------------- // Name: 1.basicDataType, isDir: true // Name: test.txt, isDir: false ``` ## ReadFile ReadFile 读取以 filename 命名的文件并返回内容 ```go fmt.Println("\n----------ReadFile-------------") if b, err = ioutil.ReadFile("test.txt"); err != nil { panic(err) } else { fmt.Printf("file context: %v\n", string(b)) } // 运行结果 // ----------ReadFile------------- // file context: 123 // 456 ``` ## TempDir TempDir 在目录 dir 中创建一个新的临时目录 ```go fmt.Println("\n----------TempDir-------------") if name, err := ioutil.TempDir("", "test-"); err != nil { panic(err) } else { fmt.Println(name) } // 运行结果 // ----------TempDir------------- // /tmp/test-3712695160 ``` ## TempFile TempFile 在目录 dir 中创建一个新的临时文件 ```go fmt.Println("\n----------TempFile-------------") if f, err := ioutil.TempFile("", "test_"); err != nil { panic(err) } else { fmt.Println(f.Name()) } // 运行结果 // ----------TempFile------------- // /tmp/test_2974692408 ``` ```go fmt.Println("\n----------WriteFile-------------") f, _ := ioutil.TempFile("", "test_") date := []byte("hello jiaxzeng") if err = ioutil.WriteFile(f.Name(), date, 0644); err != nil { panic(err) } if b, err := ioutil.ReadFile(f.Name()); err != nil { panic(err) } else { fmt.Printf("file context: %v\n", string(b)) } // 运行结果 // ----------WriteFile------------- // file context: hello jiaxzeng ``` 官方文档:https://pkg.go.dev/io@go1.18.10