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

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

相关文章:

go标准库

golang标准库io包 input output io操作是一个很庞大的工程,被封装到了许多包中以供使用 先来讲最基本的io接口 Go语言中最基本的I/O接口是io.Reader和io.Writer。这些接口定义了读取和写入数据的通用方法,为不同类型的数据源和数据目标提供了统一的接…...

【Web安全】拿到phpMyAdmin如何获取权限

文章目录 1、outfile写一句话2、general_log_file写一句话 通过弱口令拿到进到phpMyAdmin页面如何才能获取权限 1、outfile写一句话 尝试执行outfile语句写入一句话木马 select "<?php eval($_REQUEST[6868])?>" into outfile "C:\\phpStudy\\WWW\\p…...

Python与GPU编程快速入门(一)

Python与GPU编程快速入门 文章目录 Python与GPU编程快速入门1、图形处理单元(Graphics Processing Unit,GPU)1.1 并行设计1.2 速度优势本系列文章将详细介绍如何在Python中使用CUDA,从而使Python应用程序加速。 1、图形处理单元(Graphics Processing Unit,GPU) 图形处理…...

C语言--每日选择题--Day29

第一题 1. while(1) {x;}, 当x的取合适的初值时&#xff0c;可以避免死循环。 A&#xff1a;正确 B&#xff1a;错误 答案及解析 B 循环条件为1&#xff0c;在条件判断中&#xff0c;0为假&#xff0c;非0为真&#xff0c;1位真&#xff0c;所以无论x取什么&#xff0c;都是死循…...

ESP32:物联网时代的神器

随着物联网技术的不断发展&#xff0c;人们的生活正在发生着翻天覆地的变化。在这个万物互联的时代&#xff0c;ESP32作为一种功能强大的微控制器&#xff0c;正发挥着越来越重要的作用。本文将介绍ESP32的特点和应用&#xff0c;并探讨其在物联网时代的优势和潜力。 一、ESP3…...

docker和docker-compose生产的容器,不在同一个网段,解决方式

在实际项目中&#xff0c;使用docker run xxXx 和docker-compose up -d 不在同一个网段&#xff0c;一个是默认是172.17.x.x, 另一个是172.19.x.x。为解决这个问题需要自定义一个网络&#xff0c;我命名为“my-bridge” 首先熟悉几条命令&#xff1a; docker network ls 或…...

基于JavaWeb+SSM+Vue校园综合服务小程序系统的设计和实现

基于JavaWebSSMVue校园综合服务小程序系统的设计和实现 源码获取入口Lun文目录前言主要技术系统设计功能截图订阅经典源码专栏Java项目精品实战案例《500套》 源码获取 源码获取入口 Lun文目录 摘 要 I Abstract II 第一章 绪 论 1 1.1选题背景 2 1.2研究现状 3 1.3研究内容 …...

私域运营:资源盘点及争取策略

在私域运营过程中&#xff0c;资源盘点是一项至关重要的工作。它可以帮助我们了解手头现有的资源和支持&#xff0c;以便更高效地利用它们。本文将探讨如何进行私域运营中的资源盘点&#xff0c;以及如何争取更多的资源和支持。 一、现有资源 在私域运营中&#xff0c;我们需要…...

图书管理系统源码,图书管理系统开发,图书借阅系统源码整体功能演示

用户登录 基础资料 操作员管理 超期罚金设置 读者分类 读者管理 图书分类 图书管理 图书借还管理 图书借取 图书还去 图书借还查询 读者借书排行 用户登录 运行View目录下Login文件夹下的Index.csthml出现登录界面&#xff0c;输入用户名密码分别是admin密码admin12…...

(C++)字符串相乘

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 题目链接如下&#xff1a; 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能&#xff0c;轻松拿下世界 IT 名…...

1992-2021年区县经过矫正的夜间灯光数据(GNLD、VIIRS)

1992-2021年区县经过矫正的夜间灯光数据&#xff08;GNLD、VIIRS&#xff09; 1、时间&#xff1a;1992-2021年3月&#xff0c;其中1992-2013年为年度数据&#xff0c;2013-2021年3月为月度数据 2、来源&#xff1a;DMSP、VIIRS 3、范围&#xff1a;区县数据 4、指标解释&a…...

RK3568笔记六:基于Yolov8的训练及部署

若该文为原创文章&#xff0c;转载请注明原文出处。 基于Yolov8的训练及部署&#xff0c;参考鲁班猫的手册训练自己的数据集部署到RK3568,用的是正点的板子。 1、 使用 conda 创建虚拟环境 conda create -n yolov8 python3.8 ​ conda activate yolov8 2、 安装 pytorch 等…...

【活动回顾】sCrypt在柏林B2029开发者周

B2029 是柏林的一个区块链爱好者、艺术家和建设者聚会&#xff0c;学习、讨论和共同构建比特币区块链地方。 在2023年6月9日至11日&#xff0c;举行了第7次Hello Metanet研讨会。本次研讨会旨在为参与者提供一个学习、讨论和共同构建比特币区块链的平台。 在这个充满激情和创意…...

【SpringBoot3+Vue3】六【完】【番外篇】- (0-1临摹)

目录 一、后端 1、服务器管理 1.1 ProjectController 1.2 ProjectService 1.3 ProjectServiceImpl 1.4 ProjectMapper 1.5 实体类 2、项目管理 2.1 ServerManageController 2.2 ServerManageService 2.3 ServerManageServiceImpl 2.4 ServerManageMapper 2.5 Serv…...

生成式AI与大语言模型,东软已经准备就绪

伴随着ChatGPT的火爆全球&#xff0c;数以百计的大语言模型也争先恐后地加入了这一战局&#xff0c;掀起了一场轰轰烈烈的“百模大战”。毋庸置疑的是&#xff0c;继方兴未艾的人工智能普及大潮之后&#xff0c;生成式AI与大语言模型正在全球开启新一轮生产力革新的科技浪潮。 …...

Python爬虫遇到重定向URL问题时如何解决?

什么是重定向 重定向是指当用户请求一个URL时&#xff0c;服务器返回一个中断请求的URL的响应。这种情况通常发生在网站对URL进行了修改或者重定向到其他页面的情况下。其中&#xff0c;如果处理不当开发&#xff0c;可能会导致爬虫无法获取所需的数据&#xff0c;从而影响爬虫…...

【点云surface】无序点云快速三角化

1 介绍 GreedyProjectionTriangulation 是一种基于局部二维投影的三维点贪婪三角剖分算法的实现。它假定局部表面光滑&#xff0c;不同点密度区域之间的过渡相对平滑。 GreedyProjectionTriangulation算法的基本思想是通过逐步投影点云数据到一个三角化网格上来进行重建。它首…...

el-select多选下拉框实现全选功能

<el-selectv-model"query.web_ids"multiplecollapse-tagscollapse-tags-tooltip:max-collapse-tags"2"filterableplaceholder"网站"><li class"checkAllBox" style"padding: 0 32px 0 20px; border-bottom: 1px solid #…...

Elasticsearch 聚合查询(Aggregation)详解

Elasticsearch中的聚合查询&#xff0c;类似SQL的SUM/AVG/COUNT/GROUP BY分组查询&#xff0c;主要用于统计分析场景。 实例&#xff1a; import org.apache.http.HttpHost; import org.elasticsearch.action.search.SearchRequest; import org.elasticsearch.action.search.…...

数据库其它调优策略

文章目录 1. 优化MySQL服务器2. 优化数据库结构2.1 差分表&#xff1a;冷热数据分离 3. 大表优化3.1 读/写分离3.2 垂直拆分3.3 水平拆分 1. 优化MySQL服务器 电商平台&#xff0c;双十一&#xff0c;CPU使用率达到99%&#xff0c;系统的计算资源已经耗尽&#xff0c;再也无法…...

从SST到MLD:手把手教你用xarray处理CMEMS海洋数据,生成月平均图与全局年平均场

从SST到MLD&#xff1a;xarray实战CMEMS海洋数据处理与可视化全流程 海洋数据科学正经历一场由工具革新驱动的效率革命。在哥白尼海洋环境监测服务&#xff08;CMEMS&#xff09;等开放数据平台的推动下&#xff0c;获取全球海洋参数已不再是瓶颈&#xff0c;真正的挑战转向如何…...

导师要“综”更要“述”?百考通不仅梳理文献,更提炼争议与研究方向

在高校学术写作中&#xff0c;文献综述是科研工作的“地基工程”——它不仅系统梳理已有成果&#xff0c;更精准锚定研究空白&#xff0c;为后续创新提供理论支点。然而&#xff0c;对许多本科生、研究生乃至青年教师而言&#xff0c;撰写一篇逻辑严谨、内容翔实、格式规范的综…...

OpenClaw云端体验:Qwen3-14b_int4_awq镜像一键部署与自动化测试

OpenClaw云端体验&#xff1a;Qwen3-14b_int4_awq镜像一键部署与自动化测试 1. 为什么选择云端体验OpenClaw 作为一个长期关注AI自动化工具的技术爱好者&#xff0c;我一直在寻找能够快速验证OpenClaw可行性的方案。本地部署虽然可控性强&#xff0c;但配置过程繁琐——从Pyt…...

ARM交叉编译避坑指南:搞懂-mfloat-abi参数,告别ABI不兼容的诡异错误

ARM交叉编译避坑指南&#xff1a;搞懂-mfloat-abi参数&#xff0c;告别ABI不兼容的诡异错误 在嵌入式开发领域&#xff0c;ARM架构的交叉编译是每个工程师的必修课。但当你信心满满地配置好工具链&#xff0c;执行make命令时&#xff0c;突然跳出的fatal error: gnu/stubs-soft…...

go-systemd 高级特性解析:logind 和 machined API 集成

go-systemd 高级特性解析&#xff1a;logind 和 machined API 集成 【免费下载链接】go-systemd Go bindings to systemd socket activation, journal, D-Bus, and unit files 项目地址: https://gitcode.com/gh_mirrors/go/go-systemd go-systemd 是一个强大的 Go 语言…...

最新聚合短视频解析去水印系统源码 带后台 自适应双端

内容目录一、详细介绍二、效果展示1.部分代码2.效果图展示一、详细介绍 最新聚合短视频解析去水印系统源码 带后台 自适应双端 轻量化 全开源 亲测可用 后台支持修改公告使用方式&#xff0c;网站支持的应用图标等&#xff0c;应用图标支持添加修改和一键删除 更新&#xff…...

51单片机波形发生器DIY:从DAC0832到LM358,手把手教你输出四种标准波形

51单片机波形发生器实战&#xff1a;从芯片选型到信号调理的全链路解析 在电子设计领域&#xff0c;波形发生器是验证电路性能的基础工具。市售成品动辄上千元的价格让许多爱好者望而却步&#xff0c;而基于51单片机的DIY方案不仅成本可控&#xff0c;更能深入理解数字到模拟转…...

3个关键步骤:如何安全备份微信聊天记录并永久保存你的数字记忆?

3个关键步骤&#xff1a;如何安全备份微信聊天记录并永久保存你的数字记忆&#xff1f; 【免费下载链接】WeChatExporter 一个可以快速导出、查看你的微信聊天记录的工具 项目地址: https://gitcode.com/gh_mirrors/wec/WeChatExporter 你是否曾因手机丢失、系统升级或意…...

Live2D资源解析:突破格式壁垒的技术实战指南

Live2D资源解析&#xff1a;突破格式壁垒的技术实战指南 【免费下载链接】AzurLaneLive2DExtract OBSOLETE - see readme / 碧蓝航线Live2D提取 项目地址: https://gitcode.com/gh_mirrors/az/AzurLaneLive2DExtract 在游戏开发与数字内容创作领域&#xff0c;Live2D资源…...

如何在Windows上实现MacBook级别的三指拖拽体验:ThreeFingerDragOnWindows完整指南

如何在Windows上实现MacBook级别的三指拖拽体验&#xff1a;ThreeFingerDragOnWindows完整指南 【免费下载链接】ThreeFingersDragOnWindows Enables macOS-style three-finger dragging functionality on Windows Precision touchpads. 项目地址: https://gitcode.com/gh_mi…...