go标准库io、ioutil

2023-12-21 00:08
文章标签 go io 标准 ioutil

本文主要是介绍go标准库io、ioutil,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

标准库io


io. WriteString

s输出到w

func WriteString(w Writer, s string) (n int, err error)

io.Copy    

自动以32k字节的buf进行遍历复制直到遇到io.EOF。返回总共复制的字节数,如果成功err返回nil

func Copy(dst Writer, src Reader) (written int64, err error) {return copyBuffer(dst, src, nil)
}

 例如

func handlefunc(w http.ResponseWriter, r *http.Request)  {f, _ := os.Open("./1.txt")defer f.Close()_,err := io.Copy(w,f)errCheck(err)
}

io.CopyBuffer

比io.Copy多一项可以自定buf大小

func CopyBuffer(dst Writer, src Reader, buf []byte) (written int64, err error) {if buf != nil && len(buf) == 0 {panic("empty buffer in io.CopyBuffer")}return copyBuffer(dst, src, buf)
}

io.CopyN

只复制前n字节,src内容足够n个字节时err返回nil,否则返回io.EOF

func CopyN(dst Writer, src Reader, n int64) (written int64, err error) 

 io.MultiReader

func MultiReader(readers ...Reader) Reader
	r1 := strings.NewReader("first reader ")r2 := strings.NewReader("second reader ")r3 := strings.NewReader("third reader\n")r := io.MultiReader(r1, r2, r3)if _, err := io.Copy(os.Stdout, r); err != nil {log.Fatal(err)}// Output: first reader second reader third reader

 

io.Multiwriter

func MultiWriter(writers ...Writer) Writer 
        r := strings.NewReader("some io.Reader stream to be read\n")var buf1, buf2 bytes.Bufferw := io.MultiWriter(&buf1, &buf2)if _, err := io.Copy(w, r); err != nil {log.Fatal(err)}fmt.Print(buf1.String())fmt.Print(buf2.String())// Output:// some io.Reader stream to be read// some io.Reader stream to be read

io.pipe

读和写用channel通信,读操作阻塞直到有被写入内容

func Pipe() (*PipeReader, *PipeWriter)
        r, w := io.Pipe()go func() {fmt.Fprint(w, "some text to be read\n")w.Close()}()buf := new(bytes.Buffer)buf.ReadFrom(r)fmt.Print(buf.String())// Output: some text to be read

io.TeeReader

将w传给r的内容同样传给返回的reader

func TeeReader(r Reader, w Writer) Reader

io.NewSectionReader

从第off个字节开始读取n个字节

func NewSectionReader(r ReaderAt, off int64, n int64) *SectionReader
        r := strings.NewReader("some io.Reader stream to be read\n")s := io.NewSectionReader(r, 5, 16)buf := make([]byte, 6)if _, err := s.ReadAt(buf, 10); err != nil {  //SectionReader的方法log.Fatal(err)}fmt.Printf("%s\n", buf)// Output: stream
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==
        r := strings.NewReader("some io.Reader stream to be read\n")if _, err := io.Copy(os.Stdout, r); err != nil {log.Fatal(err)}r.Seek(15, io.SeekStart)if _, err := io.Copy(os.Stdout, r); err != nil {log.Fatal(err)}r.Seek(-5, io.SeekEnd)if _, err := io.Copy(os.Stdout, r); err != nil {log.Fatal(err)}// Output:// some io.Reader stream to be read// stream to be read// read
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==
其他:
至少读min个字节到buf,否则返回error: short buffer
func ReadAtLeast(r Reader, buf []byte, min int) (n int, err error)
将buf填满,否则返回error: unexpected EOF
func ReadFull(r Reader, buf []byte) (n int, err error) 
返回读取传入的reader前n个字节的reader
func LimitReader(r Reader, n int64) Reader

 

标准库ioutil


 ioutil.ReadAll

遍历增加函数内部buf容量并读取,直到把内容全部读到buf中(所以比其他方法消耗内存)

func ReadAll(r io.Reader) ([]byte, error)

ioutil.ReadFile

调用readall方法直接全部读取文件内容

func ReadFile(filename string) ([]byte, error) 

ioutil.WriteFile

写内容到文件,如果文件不存在则新建,如果存在则清空再写

func WriteFile(filename string, data []byte, perm os.FileMode) error 

ioutil.ReadDir

获取指定文件地址下面文件的信息

func ReadDir(dirname string) ([]os.FileInfo, error) 
        f,_:= ioutil.ReadDir("./")for index,fileInfo := range f{fmt.Println(index,fileInfo.Name())}
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

 ioutil.TempFile

在指定地址生成一个以pattern为前缀随机数为后缀的随机名字的文件。每调用一次会更新内部的随机种子。如果过程中发现生成的文件名在该地址已存在,再进行一次生成,和已存在文件名不同时才新建文件。

func TempFile(dir, pattern string) (f *os.File, err error)

 ioutil.TempDir

方法同上生成文件夹,返回生成的名字。

func TempDir(dir, prefix string) (name string, err error)
//文件夹操作content := []byte("temporary file's content")dir, err := ioutil.TempDir("", "example")if err != nil {log.Fatal(err)}defer os.RemoveAll(dir) // 文件夹不用可以删除tmpfn := filepath.Join(dir, "tmpfile")if err := ioutil.WriteFile(tmpfn, content, 0666); err != nil {log.Fatal(err)}//文件操作content := []byte("temporary file's content")tmpfile, err := ioutil.TempFile("", "example.*.txt")if err != nil {log.Fatal(err)}defer os.Remove(tmpfile.Name()) // 文件不用可以删除if _, err := tmpfile.Write(content); err != nil {tmpfile.Close()log.Fatal(err)}if err := tmpfile.Close(); err != nil {log.Fatal(err)}
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

 

 

 

这篇关于go标准库io、ioutil的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/518017

相关文章

Go Playground 在线编程环境

For all examples in this and the next chapter, we will use Go Playground. Go Playground represents a web service that can run programs written in Go. It can be opened in a web browser using the follow

数据治理框架-ISO数据治理标准

引言 "数据治理"并不是一个新的概念,国内外有很多组织专注于数据治理理论和实践的研究。目前国际上,主要的数据治理框架有ISO数据治理标准、GDI数据治理框架、DAMA数据治理管理框架等。 ISO数据治理标准 改标准阐述了数据治理的标准、基本原则和数据治理模型,是一套完整的数据治理方法论。 ISO/IEC 38505标准的数据治理方法论的核心内容如下: 数据治理的目标:促进组织高效、合理地

go基础知识归纳总结

无缓冲的 channel 和有缓冲的 channel 的区别? 在 Go 语言中,channel 是用来在 goroutines 之间传递数据的主要机制。它们有两种类型:无缓冲的 channel 和有缓冲的 channel。 无缓冲的 channel 行为:无缓冲的 channel 是一种同步的通信方式,发送和接收必须同时发生。如果一个 goroutine 试图通过无缓冲 channel

C 标准库 - `<float.h>`

C 标准库 - <float.h> 概述 <float.h> 是 C 标准库中的一个头文件,它定义了与浮点数类型相关的宏。这些宏提供了关于浮点数的属性信息,如精度、最小和最大值、以及舍入误差等。这个头文件对于需要精确控制浮点数行为的程序非常有用,尤其是在数值计算和科学计算领域。 主要宏 <float.h> 中定义了许多宏,下面列举了一些主要的宏: FLT_RADIX:定义了浮点数的基数。

如何确定 Go 语言中 HTTP 连接池的最佳参数?

确定 Go 语言中 HTTP 连接池的最佳参数可以通过以下几种方式: 一、分析应用场景和需求 并发请求量: 确定应用程序在特定时间段内可能同时发起的 HTTP 请求数量。如果并发请求量很高,需要设置较大的连接池参数以满足需求。例如,对于一个高并发的 Web 服务,可能同时有数百个请求在处理,此时需要较大的连接池大小。可以通过压力测试工具模拟高并发场景,观察系统在不同并发请求下的性能表现,从而

【Go】go连接clickhouse使用TCP协议

离开你是傻是对是错 是看破是软弱 这结果是爱是恨或者是什么 如果是种解脱 怎么会还有眷恋在我心窝 那么爱你为什么                      🎵 黄品源/莫文蔚《那么爱你为什么》 package mainimport ("context""fmt""log""time""github.com/ClickHouse/clickhouse-go/v2")func main(

Java IO 操作——个人理解

之前一直Java的IO操作一知半解。今天看到一个便文章觉得很有道理( 原文章),记录一下。 首先,理解Java的IO操作到底操作的什么内容,过程又是怎么样子。          数据来源的操作: 来源有文件,网络数据。使用File类和Sockets等。这里操作的是数据本身,1,0结构。    File file = new File("path");   字

springboot体会BIO(阻塞式IO)

使用springboot体会阻塞式IO 大致的思路为: 创建一个socket服务端,监听socket通道,并打印出socket通道中的内容。 创建两个socket客户端,向socket服务端写入消息。 1.创建服务端 public class RedisServer {public static void main(String[] args) throws IOException {

Java基础回顾系列-第七天-高级编程之IO

Java基础回顾系列-第七天-高级编程之IO 文件操作字节流与字符流OutputStream字节输出流FileOutputStream InputStream字节输入流FileInputStream Writer字符输出流FileWriter Reader字符输入流字节流与字符流的区别转换流InputStreamReaderOutputStreamWriter 文件复制 字符编码内存操作流(

Go Select的实现

select语法总结 select对应的每个case如果有已经准备好的case 则进行chan读写操作;若没有则执行defualt语句;若都没有则阻塞当前goroutine,直到某个chan准备好可读或可写,完成对应的case后退出。 Select的内存布局 了解chanel的实现后对select的语法有个疑问,select如何实现多路复用的,为什么没有在第一个channel操作时阻塞 从而导