网站关键词提升,店铺首页图片,网站开发制作计算器,甘肃省建设工程安全质量监督管理局网站官网golang标准库io包 input output
io操作是一个很庞大的工程#xff0c;被封装到了许多包中以供使用
先来讲最基本的io接口
Go语言中最基本的I/O接口是io.Reader和io.Writer。这些接口定义了读取和写入数据的通用方法#xff0c;为不同类型的数据源和数据目标提供了统一的接…golang标准库io包 input output
io操作是一个很庞大的工程被封装到了许多包中以供使用
先来讲最基本的io接口
Go语言中最基本的I/O接口是io.Reader和io.Writer。这些接口定义了读取和写入数据的通用方法为不同类型的数据源和数据目标提供了统一的接口。 Reader 接口: Read(p []byte) (n int, err error) 方法定义了读取数据的通用方式。p 参数是一个字节切片用于接收从数据源中读取的数据。n 返回值表示读取的字节数通常是成功读取的字节数。err 返回值是一个可能的错误如果读取过程中出现问题就会返回错误信息。 Reader 接口的实现可以用于从不同类型的数据源如文件、网络连接、内存缓冲区等读取数据并将数据存储到提供的字节切片中。 Writer 接口: Write(p []byte) (n int, err error) 方法定义了写入数据的通用方式。p 参数是一个字节切片包含要写入的数据。n 返回值表示写入的字节数通常是成功写入的字节数。err 返回值是一个可能的错误如果写入过程中出现问题就会返回错误信息。 Writer 接口的实现可以用于将数据写入不同类型的数据目标如文件、网络连接、内存缓冲区等。
Reader接口
type Reader interface {Read(P []byte) (n int, err error)
}Writer接口
type Writer interface {Write(P []byte) (n int, err error)
}可以看到这两个基础的接口实现次数非常多
读字符串
r : strings.NewReader(hello world)
buf : make([]byte, 20)
r.Read(buf)
fmt.Println(string(buf):, string(buf))r : strings.NewReader(hello world)这一行创建了一个名为 r 的字符串读取器*strings.Reader并将其初始化为包含字符串 “hello world” 的读取器。buf : make([]byte, 20)这一行创建了一个名为 buf 的字节切片byte slice切片的长度为 20 个字节。r.Read(buf)这一行通过字符串读取器 r 从其内容中读取数据然后将读取的数据存储到字节切片 buf 中。在这里它会尝试从字符串 “hello world” 中读取数据并将其存储在 buf 中。由于 buf 的长度为 20因此最多会读取 20 个字节。如果 “hello world” 的长度不足 20 个字节那么只会读取实际长度的字节。fmt.Println(string(buf):, string(buf))最后这一行将 buf 中的字节数据转换为字符串并打印出来。这将输出 “string(buf): hello world”因为 “hello world” 是读取的字符串数据。 golang标准库bufio
bufio缩写自buffered I/O是Go语言标准库中的一个包用于提供缓冲读写功能以提高I/O操作的效率。bufio包中包含了一些类型和函数可以帮助你在读写数据时减少系统调用的次数从而提高性能。
类型
bufio.Reader用于包装io.Reader接口提供缓冲读取功能。通过使用Reader你可以一次读取大块数据并以更小的块进行处理减少I/O操作的次数。bufio.Writer用于包装io.Writer接口提供缓冲写入功能。通过使用Writer你可以将数据一次写入缓冲区然后在需要时刷新到底层io.Writer从而减少写入操作的次数。bufio.Scanner用于逐行扫描文本可以通过自定义的分隔符分割文本。这对于处理文本文件特别有用。
函数 bufio.NewReader用于创建一个新的bufio.Reader以包装一个io.Reader。这个函数会返回一个具有默认缓冲大小的Reader。 bufio.NewWriter用于创建一个新的bufio.Writer以包装一个io.Writer。这个函数会返回一个具有默认缓冲大小的Writer。 bufio.NewScanner用于创建一个新的bufio.Scanner以包装一个io.Reader。这个函数会返回一个Scanner它可以逐行扫描文本。 bufio.NewScanner用于创建一个新的bufio.Scanner以包装一个io.Reader。这个函数会返回一个Scanner它可以逐行扫描文本。 Scanner.Split用于自定义分隔符的Scanner默认情况下使用换行符分割文本。 Reader.Read用于从缓冲区中读取数据当缓冲区为空时它会从底层io.Reader中读取更多数据并填充缓冲区。 Writer.Write用于将数据写入缓冲区当缓冲区满时它会将数据刷新到底层的io.Writer。 Writer.Flush用于手动刷新bufio.Writer的缓冲区确保缓冲中的数据被写入底层io.Writer。
缓冲大小默认情况下bufio.Reader和bufio.Writer使用4096字节的缓冲区。你可以使用自定义的缓冲大小来优化性能根据你的应用程序需求。性能提升通过减少I/O操作的次数bufio可以显著提高文件和网络读写的性能。特别是对于大型数据集或高并发的情况bufio非常有用。
//r : strings.NewReader(hello world)
f, _ : os.Open(a.txt)
defer f.Close()
r2 : bufio.NewReader(f)
s, _ : r2.ReadString(\n)
fmt.Println(s)可以把读取的串或文件内的值直接封装到s中
读取ReadstringReadSliceReadLineReadBytes等等都是一样的道理
func test6() {s : strings.NewReader(ABC DEF GHI JKL)br : bufio.NewReader(s)w, _ : br.ReadBytes( )fmt.Println(string(w))w, _ br.ReadBytes( )fmt.Println(string(w))w, _ br.ReadBytes( )fmt.Println(string(w))w, _ br.ReadBytes( )fmt.Println(string(w))
}写 func test9() {f, _ : os.OpenFile(a.txt, os.O_CREATE|os.O_RDWR, os.ModePerm)defer f.Close()//bufio.NewWriter(f)w : bufio.NewWriter(f)w.WriteString(hello world)w.Flush()
}
可以把hello world写进a.txt中。Reset可以清空缓冲区。
Scan相关函数扫描ScanBytes ScanRunes ScanWords ScanLines …
func test10() {s : strings.NewReader(ABC DEF GHI JKL)bs : bufio.NewScanner(s)bs.Split(bufio.ScanWords)for bs.Scan() {fmt.Println(bs.Text())}
}
bufio.ScanWords可以将字符串按照空格分隔