当前位置: 首页 > article >正文

go标准库

golang标准库io包 input output

io操作是一个很庞大的工程,被封装到了许多包中以供使用

先来讲最基本的io接口

Go语言中最基本的I/O接口是io.Readerio.Writer。这些接口定义了读取和写入数据的通用方法,为不同类型的数据源和数据目标提供了统一的接口。

  1. Reader 接口:

    • Read(p []byte) (n int, err error) 方法定义了读取数据的通用方式。
    • p 参数是一个字节切片,用于接收从数据源中读取的数据。
    • n 返回值表示读取的字节数,通常是成功读取的字节数。
    • err 返回值是一个可能的错误,如果读取过程中出现问题,就会返回错误信息。

    Reader 接口的实现可以用于从不同类型的数据源(如文件、网络连接、内存缓冲区等)读取数据,并将数据存储到提供的字节切片中。

  2. 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)
}

image-20231028155518048

可以看到:这两个基础的接口实现次数非常多

读字符串:

r := strings.NewReader("hello world")
buf := make([]byte, 20)
r.Read(buf)
fmt.Println("string(buf):", string(buf))
  1. r := strings.NewReader("hello world"):这一行创建了一个名为 r 的字符串读取器(*strings.Reader),并将其初始化为包含字符串 “hello world” 的读取器。
  2. buf := make([]byte, 20):这一行创建了一个名为 buf 的字节切片(byte slice),切片的长度为 20 个字节。
  3. r.Read(buf):这一行通过字符串读取器 r 从其内容中读取数据,然后将读取的数据存储到字节切片 buf 中。在这里,它会尝试从字符串 “hello world” 中读取数据并将其存储在 buf 中。由于 buf 的长度为 20,因此最多会读取 20 个字节。如果 “hello world” 的长度不足 20 个字节,那么只会读取实际长度的字节。
  4. fmt.Println("string(buf):", string(buf)):最后,这一行将 buf 中的字节数据转换为字符串,并打印出来。这将输出 “string(buf): hello world”,因为 “hello world” 是读取的字符串数据。

image-20231031144624290

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

  1. 缓冲大小:默认情况下,bufio.Readerbufio.Writer使用4096字节的缓冲区。你可以使用自定义的缓冲大小来优化性能,根据你的应用程序需求。
  2. 性能提升:通过减少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中

读取Readstring,ReadSlice,ReadLine,ReadBytes等等,都是一样的道理

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))
}

写:

image-20231031152937706

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中。

image-20231031153535292

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可以将字符串按照空格分隔

http://www.kler.cn/news/149289.html

相关文章:

  • 基于协同过滤算法的音乐推荐系统的研究与实现
  • 激光雷达毫米波雷达
  • PyTorch:模型加载方法详解
  • Vue2 若依框架头像上传 全部代码
  • 建筑工程模板包工包料价格
  • Kubernetes基础(九)-标签管理
  • 【Web】攻防世界 难度3 刷题记录(1)
  • Linux 调试工具:gdb
  • 使用shell快速查看电脑曾经连接过的WiFi密码
  • 记一次简单的PHP反序列化字符串溢出
  • 交流负载的功能实现原理
  • 各种排序算法
  • sed应用
  • 视觉CV-AIGC一周最新技术精选(2023-11)
  • 【面经八股】搜广推方向:面试记录(四)
  • git commit 撤销的三种方法
  • Kotlin学习——kt里的集合,Map的各种方法之String篇
  • QT6 Creator编译KDDockWidgets并部署到QT
  • C#通过NPOI 读、写Excel数据;合并单元格、简单样式修改;通过读取已有的Excel模板另存为文件
  • SP3109 STRLCP - Longest Common Prefix 题解
  • 0基础学习VR全景平台篇第123篇:VR视频航拍补天 - PR软件教程
  • 前端---CSS篇(详解CSS)
  • 微服务--03--OpenFeign 实现远程调用 (负载均衡组件SpringCloudLoadBalancer)
  • 【 Kubernetes 风云录 】- Istio 应用多版本流量控制
  • 【古月居《ros入门21讲》学习笔记】17_launch启动文件的使用方法
  • dockerfile指令学习
  • ubuntu改window任务栏
  • Leetcode—2336.无限集中的最小数字【中等】
  • 随笔(持续更新)
  • SELinux零知识学习三十七、SELinux策略语言之约束(1)