标准库之ioutil
1、NopCloser 函数
有时候我们需要传递一个 io.ReadCloser 的实例,而我们现在有一个 io.Reader 的实例,比如:strings.Reader ,这个时候 NopCloser 就派上用场了。它包装一个io.Reader,返回一个 io.ReadCloser ,而相应的 Close 方法啥也不做,只是返回 nil。
比如,在标准库 net/http 包中的 NewRequest,接收一个 io.Reader 的 body,而实际上,Request 的 Body 的类型是 io.ReadCloser,因此,代码内部进行了判断,如果传递的 io.Reader 也实现了 io.ReadCloser 接口,则转换,否则通过ioutil.NopCloser 包装转换一下。相关代码如下:
1 2 3 4 | rc, ok := body.(io.ReadCloser) if !ok && body != nil { rc = ioutil.NopCloser(body) } |
2、ReadAll 函数
Go 提供了 ReadAll 这个函数,用来从io.Reader 中一次读取所有数据。
1 | func ReadAll(r io.Reader) ([]byte, error) |
阅读该函数的源码发现,它是通过 bytes.Buffer 中的 ReadFrom 来实现读取所有数据的。该函数成功调用后会返回 err == nil 而不是 err == EOF。
3、ReadDir 函数
ReadDir,它读取目录并返回排好序的文件和子目录名( []os.FileInfo )。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | //编写程序输出某目录下的所有文件(包括子目录) func main() { dir := os.Args[1] listAll(dir,0) } func listAll(path string, curHier int){ fileInfos, err := ioutil.ReadDir(path) if err != nil{fmt.Println(err); return } for _, info := range fileInfos{ if info.IsDir(){ for tmpHier := curHier; tmpHier > 0; tmpHier--{ fmt.Printf( "|\t" ) } fmt.Println(info.Name(), "\\" ) listAll(path + "/" + info.Name(),curHier + 1) } else { for tmpHier := curHier; tmpHier > 0; tmpHier--{ fmt.Printf( "|\t" ) } fmt.Println(info.Name()) } } } |
4、ReadFile 和 WriteFile 函数
ReadFile 从 filename 指定的文件中读取数据并返回文件的内容。成功的调用返回的err 为 nil 而非 EOF。因为本函数定义为读取整个文件,它不会将读取返回的 EOF 视为应报告的错误(同 ReadAll )。
ReadFile 函数的签名如下:
1 | func ReadFile(filename string) ([]byte, error) |
WriteFile 将data写入filename文件中,当文件不存在时会根据perm指定的权限进行创建一个,文件存在时会先清空文件内容。对于 perm 参数,我们一般可以指定为:0666,具体含义 os 包中讲解。
WriteFile 函数的签名如下:
1 | func WriteFile(filename string, data []byte, perm os.FileMode) error |
5、TempDir 和 TempFile 函数
操作系统中一般都会提供临时目录,比如 linux 下的 /tmp 目录(通过 os.TempDir() 可以获取到)。有时候,我们自己需要创建临时目录,比如 Go 工具链源码中(src/cmd/go/build.go),通过 TempDir 创建一个临时目录,用于存放编译过程的临时文件:
1 | b.work, err = ioutil.TempDir( "" , "go-build" ) |
第一个参数如果为空,表明在系统默认的临时目录( os.TempDir )中创建临时目录;第二个参数指定临时目录名的前缀,该函数返回临时目录的路径。
相应的,TempFile 用于创建临时文件。如 gofmt 命令的源码中创建临时文件:
1 | f1, err := ioutil.TempFile( "" , "gofmt" ) |
参数和 ioutil.TempDir 参数含义类似。
注意:创建者创建的临时文件和临时目录要负责删除这些临时目录和文件。如删除临时文件:
1 2 3 4 | defer func () { f.Close() os.Remove(f.Name()) }() |
参考:ioutil — 方便的 IO 操作函数集 · Go语言标准库 (studygolang.com)
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战