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.mfbz.cn/a/197908.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【JavaEE初阶】——Linux 基本使用和 web 程序部署(下)

文章目录 前言一、Linux 常用命令 1.1 ls 命令 1.2 pwd 命令 1.3 cd 命令 1.4 touch 命令 1.5 cat 命令 1.6 mkdir 命令 1.7 rm 命令 1.8 cp 命令 1.9 mv 命令 1.10 man 命令 1.11 less 命令 1.12 head 命令 1.13 tail 命…

ABAP算法 模拟退火

模拟退火算法 算法原理及概念本文仅结合实现过程做简述 模拟退火算法是一种解决优化问题的算法。通过模拟固体退火过程中的原子热运动来寻找全局最优解。在求解复杂问题时,模拟退火算法可以跳出局部最优解获取全局最优解。 模拟退火算法包含退火过程和Metropolis算法…

八、Lua数组和迭代器

一、Lua数组 数组,就是相同数据类型的元素按一定顺序排列的集合,可以是一维数组和多维数组。 在 Lua 中,数组不是一种特定的数据类型,而是一种用来存储一组值的数据结构。 实际上,Lua 中并没有专门的数组类型&#xf…

供配电系统智能化监控

供配电系统智能化监控是指利用先进的监测技术、自动化控制技术、计算机网络技术等,对供配电系统进行实时、全方位的监测和控制,以实现供配电系统的安全、稳定、高效运行。 供配电系统智能化监控的主要功能包括: 实时数据采集:通过…

使用 SwiftUI 创建一个灵活的选择器

文章目录 前言可选择协议自定义化FlexiblePicker 逻辑FlexiblePicker 视图总结 前言 最近,在我正在开发一个在 Dribbble 上找到的设计的 SwiftUI 实现时,我想到了一个点子,可以通过一些酷炫的筛选器扩展该项目以缩小结果列表。 我决定筛选视…

为什么我不能给shopify的图片添加alt

首先我们要明白是什么ALT标签,为什么要添加这个标签,这个标签有什么用 ALT标签是什么 ALT属性是HTML的一部分,它为那些无法查看图像的用户提供替代的文本描述。 ALT标签有什么用 使用ALT属性还可以帮助搜索引擎爬虫更好地理解您的网站内容。有…

OpenSSL 使用AES对文件加解密

AES(Advanced Encryption Standard)是一种对称加密算法,它是目前广泛使用的加密算法之一。AES算法是由美国国家标准与技术研究院(NIST)于2001年发布的,它取代了原先的DES(Data Encryption Stand…

sed命令

目录 一、sed 1.sed命令选项 2.语法选项 3.sed脚本格式 4.搜索替代 5.分组后向引用 1.提取版本号: 2.提取IP地址 3.提取数字权限 6.变量 二、免交互 1.多行重定向 2.免交互脚本 总结:本章主要介绍了seq和免交互的用法及相关知识 一、sed s…

p9 第55题 两个有序单链表L1,L2求交的操作,得到新的链表L3,L3任然保持有序的状态 中国计量大学2016年数据结构题(c语言代码实现)

本题代码如下 linklist merge(linklist* L1, linklist* L2)//将两个链表的公共元素合并产生新链表 {lnode* ra (*L1)->next, * rb (*L2)->next;lnode* r;lnode* s;lnode* C (lnode*)malloc(sizeof(lnode));C->next NULL;r C;while (ra && rb)//循环跳出…

泛微 E-Office sample权限绕过+文件上传组合漏洞Getshell

0x01 产品简介 泛微E-Office是一款标准化的协同 OA 办公软件,泛微协同办公产品系列成员之一,实行通用化产品设计,充分贴合企业管理需求,本着简洁易用、高效智能的原则,为企业快速打造移动化、无纸化、数字化的办公平台。 0x02 漏…

lv11 嵌入式开发 WDT实验 12

目录 1 WDT简介 2 Exynos4412下的WDT控制器 2.1 概述 2.2 WDT的特性 2.3 工作原理 2.4 其他细节 3 WDT寄存器详解 3.1 WTCON控制寄存器 3.2 WTDAT 实时中断寄存器 3.3 WTCNT 递减计数器 3.4 WTCLRINT清除中断寄存器 4 WDT编程 1 WDT简介 Watch Dog Timer即看门狗定…

探索三种生成模型:基于DDPMs、NCSNs和SDEs方法的Diffusion

探索三种生成模型:基于DDPMs、NCSNs和SDEs方法的Diffusion 去噪扩散概率模型(DDPMs)正向过程反向过程 噪声条件得分网络(NCSNs)正向过程初始化训练 NCSNs生成样本 反向过程 随机微分方程(SDEs)原…

自然资源科普交互大屏助力自然资源的保护

在当代社会,自然资源的科学管理和可持续利用变得愈发重要。为了提高公众对于自然资源的认知和理解,科普交互大屏成为一个新兴的工具。它通过生动的图像和实时数据展示,以及与观众的互动方式,让人们更深入地了解自然资源和环境保护…

eNSP防火墙USG6000V使用Web界面登入教程

文章目录 登入流程1、下载USG6000V的镜像包2、导入USG6000V的镜像包3、配置防火墙web页面4、修改本机vmnet1网卡的ipv4地址5、在eNSP上添加云6、配置防火墙管理地址,开启http服务7、关闭电脑防火墙8、访问web页面 登入流程 1、下载USG6000V的镜像包 链接&#xff…

数据库应用:MongoDB 库与集合管理

目录 一、理论 1.MongoDB用户管理 2.MogoDB库管理 3.MogoDB集合管理 二、实验 1.MongoDB用户管理 2.MogoDB库管理 3.MogoDB集合管理 三、问题 1.不显示新创建的数据库 2.插入数据报错 3.删除指定数据库报错 一、理论 1.MongoDB用户管理 (1) 内置角色 数据库用户…

Postman进阶功能实战演练

Postman除了前面介绍的一些功能,还有其他一些小功能在日常接口测试或许用得上。今天,我们就来盘点一下,如下所示: 1.数据驱动 想要批量执行接口用例,我们一般会将对应的接口用例放在同一个Collection中,然…

ZYNQ_project:IIC_EEPROM

EEPROM简介: EEPROM(Electrically Erasable Progammable Read Only Memory, E2PROM)是指带电可擦可编程只读存 储器,是一种常用的非易失性存储器(掉电数据不丢失), E2PROM 有多种类型的产品,我…

【计算机网络学习之路】序列化,反序列化和初识协议

文章目录 前言一. 序列化和反序列化1.自己实现2. JSON 二. 初识协议结束语 前言 本系列文章是计算机网络学习的笔记,欢迎大佬们阅读,纠错,分享相关知识。希望可以与你共同进步。 本篇博文讲解应用层的序列化和反序列化,还有见一…

Linux基础项目开发1:量产工具——显示系统(二)

前言: 前面我们已经对这个项目的基本框架有了一个初步的了解与认识,要实现显示管理器与输入管理器,有输入有输出基本就实现这个项目的大部分功能了,首先我们先来做显示系统,对于上层系统为了让程序更好扩展&#xff0c…

Python分享之字符串格式化 (%操作符)

在许多编程语言中都包含有格式化字符串的功能,比如C和Fortran语言中的格式化输入输出。Python中内置有对字符串进行格式化的操作%。 模板 格式化字符串时,Python使用一个字符串作为模板。模板中有格式符,这些格式符为真实值预留位置&#xff…
最新文章