【启程Golang之旅】让文件操作变得简单
欢迎来到Golang的世界!在当今快节奏的软件开发领域,选择一种高效、简洁的编程语言至关重要。而在这方面,Golang(又称Go)无疑是一个备受瞩目的选择。在本文中,带领您探索Golang的世界,一步步地了解这门语言的基础知识和实用技巧。
目录
初识文件
IO的引入
读取文件
写入文件
文件复制
初识文件
文件是保存数据的地方,是数据源的一种,比如大家经常使用的word文档、txt文件、excel文件、jpg文件等都是文件,文件最主要的作用就是保存数据,它既可以保存一张图片,也可以保持视频,声音等等,在go语言中os包下的file结构体封装了对文件的操作,这里我们可以查看一下官方文档的讲解,地址 ,具体如下:
这里我做一个简单的代码演示:
package main
import ("fmt""os"
)
func main() {// 打开文件file, err := os.Open("d:/text.txt")if err != nil {fmt.Println("文件打开出错,对应错误为:", err)return}// 没有出错,输出文件内容fmt.Println("文件内容为:", file)// 关闭文件err1 := file.Close()if err != nil {fmt.Println("文件关闭出错,对应错误为:", err1)} else {fmt.Println("文件关闭成功")}
}
运行的效果如下所示:
IO的引入
在上面的代码中,我这里做了一个简单的文件操作演示,这里是用到了一个IO的包,IO包是一个核心的基础包,它定义了一系列用于处理输入/输出(I/O)操作的接口、方法和类型。这些接口和类型构成了Go语言中I/O操作的基石,为开发者提供了一种统一且灵活的方式来处理不同类型的I/O源,如文件、网络连接、内存缓冲区等。
io 包的作用和意义主要体现在以下几个方面:
1)抽象化:IO包通过定义一系列的接口,如 Reader、Writer、Closer、Seeker 等,为各种I/O源提供了一个统一的抽象层。这使得开发者可以编写与具体I/O源无关的代码,只要这些源实现了相应的接口即可。
2)灵活性:由于IO包中的接口是通用的,因此可以很容易地将它们组合在一起,实现复杂的I/O操作。例如,可以使用 IO.Pipe 创建一个管道,将两个 IO.Reader 和 IO.Writer 对象连接在一起,实现数据的传输和转换。
3)性能优化:Go语言对I/O操作进行了深入的优化,特别是在并发和内存管理方面,通过使用IO包中的接口和类型,开发者可以充分利用这些优化,提高程序的性能。
流对文件操作的概念可以从如下作图可以看到:
读取文件
读取文件的内容并显示在终端使用了 os.ReadFile 函数来读取文件。这个函数的特点是它会一次性读取文件的全部内容到内存中,并且当函数返回时,文件已经被自动关闭了。因此,您不需要(也不能)手动关闭文件,因为 os.ReadFile 并没有返回一个 *File 类型的对象供您调用 Close 方法:
package main
import ("fmt""os"
)
func main() {// 读取文件content, err := os.ReadFile("d:/text.txt") // 返回内容为:[]byte,错误为:errorif err != nil { // 读取有误fmt.Println("读取出错,错误为:", err)}// 如果读取成功,将内容显示在终端即可:fmt.Println(string(content))
}
效果如下:
当然在go语言中,读取文件的操作通常涉及以下几个步骤,打开文件,使用 os 包的 Open 函数打开一个文件,该函数返回一个 *File 类型的值和一个 error 类型的值,表示打开文件时可能发生的错误:
file, err := os.Open("filename.txt")
if err != nil { log.Fatal(err)
}
defer file.Close() // 确保文件在使用完毕后被关闭
这里做一个简单的演示:
package main
import ("bufio""fmt""io""os"
)
func main() {// 打开文件file, err := os.Open("d:/text.txt")if err != nil {fmt.Println("文件打开失败,err=", err)return}// 当函数退出时,让file关闭,防止内存泄露defer file.Close()// 创建一个流reader := bufio.NewReader(file)// 读取文件for {str, err := reader.ReadString('\n') // 读取到一个换行就结束if err == io.EOF { // io.EOF表示文件读取完毕break}// 如果没有读取到文件结尾的话,就正常输出文件内容即可fmt.Println(str)}fmt.Println("文件读取完毕")
}
效果如下:
关闭文件:使用 Close 方法关闭文件。在上面的例子中,我们使用了 defer 语句来确保文件在函数返回前被关闭,这是一种常见的做法:
defer file.Close()
处理读取到的内容:将读取到的内容(通常是字节切片)转换为字符串或其他需要的数据类型,然后进行进一步的处理:
text := string(data) // 如果使用ioutil.ReadAll,可以直接将字节切片转换为字符串
写入文件
在Go语言中,你可以使用os包中的Create、OpenFile或WriteFile函数以及io/ioutil包中的WriteFile函数来写入文件。以下是几个示例来说明如何进行文件写入操作:
os.Create函数会创建一个新的文件(如果文件已存在,则会被截断为零长度),或者打开现有的文件以供写入。如果成功,它会返回一个文件对象和一个nil错误。
package main import ( "fmt" "log" "os"
) func main() { // 创建一个文件用于写入。如果文件已存在,它将被截断为零长度。 file, err := os.Create("example.txt") if err != nil { log.Fatal(err) } defer file.Close() // 写入一些数据到文件 data := []byte("Hello, Gopher!\n") _, err = file.Write(data) if err != nil { log.Fatal(err) } fmt.Println("数据已成功写入文件")
}
os.OpenFile函数用于按指定的模式打开一个文件。它允许你指定文件的权限和是否应该创建文件(如果它不存在)。
package main import ( "fmt" "log" "os"
) func main() { // 使用os.O_WRONLY|os.O_CREATE|os.O_TRUNC打开文件进行写入 // 如果文件不存在,则创建它;如果文件已存在,则截断它 file, err := os.OpenFile("example.txt", os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0666) if err != nil { log.Fatal(err) } defer file.Close() // 写入数据... // ...(同上)
}
ioutil.WriteFile函数是一个方便的函数,用于将数据直接写入文件。如果文件不存在,它会被创建;如果文件已存在,它会被截断为零长度。
package main import ( "fmt" "io/ioutil" "log"
) func main() { // 使用ioutil.WriteFile直接写入数据到文件 data := []byte("Hello, Gopher!\n") err := ioutil.WriteFile("example.txt", data, 0666) if err != nil { log.Fatal(err) } fmt.Println("数据已成功写入文件")
}
这里拿os.OpenFile做一个简单的演示,具体代码如下:
package mainimport ("bufio""fmt""os"
)func main() {// 写入文件操作// 打开文件file, err := os.OpenFile("d:/text.txt", os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0755)if err != nil {fmt.Println("文件打开失败", err)return}// 及时关闭文件defer file.Close()// 写入文件writer := bufio.NewWriter(file)writer.WriteString("hello world")if err != nil {return}// 流带缓冲区,刷新数据,真正写入文件writer.Flush()
}
得到的效果如下所示:
文件复制
在Go语言中,进行文件复制(从一个文件写入到另一个文件)通常涉及以下几个步骤:
1)打开源文件以进行读取。
2)创建一个新的目标文件以进行写入,或者如果目标文件已存在,则打开它以进行写入(可能需要覆盖它)。
3)读取源文件的内容,并将其写入目标文件。
4)关闭源文件和目标文件。
以下是一个简单的示例,演示了如何使用Go语言进行文件复制:
package main import ( "fmt" "io" "os"
) func main() { // 源文件路径 srcFile := "source.txt" // 目标文件路径 dstFile := "destination.txt" // 打开源文件 sourceFile, err := os.Open(srcFile) if err != nil { fmt.Println("打开源文件时出错:", err) return } defer sourceFile.Close() // 创建目标文件(如果已存在,将被覆盖) destinationFile, err := os.Create(dstFile) if err != nil { fmt.Println("创建目标文件时出错:", err) return } defer destinationFile.Close() // 使用io.Copy函数复制文件内容 // io.Copy从源文件复制数据到目标文件,直到遇到错误或EOF _, err = io.Copy(destinationFile, sourceFile) if err != nil { fmt.Println("复制文件时出错:", err) return } fmt.Println("文件复制成功")
}
在这个示例中,我们使用了os.Open函数打开源文件,os.Create函数创建目标文件(如果目标文件已存在,它将被覆盖),以及io.Copy函数来复制文件内容。io.Copy函数会处理缓冲和可能的错误,并返回复制的字节数和可能发生的错误。
相关文章:
【启程Golang之旅】让文件操作变得简单
欢迎来到Golang的世界!在当今快节奏的软件开发领域,选择一种高效、简洁的编程语言至关重要。而在这方面,Golang(又称Go)无疑是一个备受瞩目的选择。在本文中,带领您探索Golang的世界,一步步地了…...
oracle视图无法删除,orcl视图删除卡住怎么办
话说,这是一个来自周四加班夜晚的故事,当时我的PL/SQL卡住了,每次查询这个表时都会卡住。 经过一番研究,我找到了解决办法,分为三个步骤: 使用以下查询语句获取正在执行的SQL查询的SID和OracleID…...
ug编程怎么录制宏:一步步探索自动化编程的奥秘
ug编程怎么录制宏:一步步探索自动化编程的奥秘 在UG编程的浩瀚领域中,录制宏是一项强大而神秘的功能。它就像一位魔法师,能够将繁琐的重复操作化为简单的指令,释放出惊人的编程效率。然而,对于许多初学者来说…...
深度学习Week16——数据增强
文章目录 深度学习Week16——数据增强 一、前言 二、我的环境 三、前期工作 1、配置环境 2、导入数据 2.1 加载数据 2.2 配置数据集 2.3 数据可视化 四、数据增强 五、增强方式 1、将其嵌入model中 2、在Dataset数据集中进行数据增强 六、训练模型 七、自定义增强函数 一、前言…...
python-自幂数判断
[题目描述]: 自幂数是指,一个N 位数,满足各位数字N 次方之和是本身。例如,153153 是 33 位数,其每位数的 33 次方之和,135333153135333153,因此 153153 是自幂数;16341634 是 44 位数…...
RocketMQ教程(三):RocketMQ的核心组件
四个核心组件 RocketMQ 的架构采用了典型的分布式系统设计理念,以确保高性能、高可用和可扩展性。RocketMQ 主要由四个核心组件构成:NameServer、Broker、Producer 和 Consumer。下面是对这些组件以及它们在 RocketMQ 中的角色和功能的概述: 1. NameServer 角色和功能:Name…...
46.SQLserver中按照多条件分组:查询每个地方的各种水果的种植数量,新增时,一个地方同时有几种水果,只插入一条记录,同时多种水果之间使用|隔开
1.SQLserver中按照多条件分组 ,分组条件包括(一个字段使用|进行分割,如:apple|orange,查询时,apple和orange分别对应一条数据) 例如:SQL如下: SELECT FROM ( SELECT CDFBM 地方编码…...
C盘满了怎么办,Windows11的C盘没有磁盘清理选项怎么办,一次搞定
问题: 太久没清电脑了,满的跟垃圾堆一样。。。C盘红色看上去很不妙。 一. C盘满了怎么办: 1. 删除临时文件 找到 C:\Windows\Temp,进入Temp资料夹,选中所有文件夹和文件,按下ShiftDelete键,彻…...
「动态规划」当小偷改行去当按摩师,会发生什么?
一个有名的按摩师会收到源源不断的预约请求,每个预约都可以选择接或不接。在每次预约服务之间要有休息时间,因此她不能接受相邻的预约。给定一个预约请求序列,替按摩师找到最优的预约集合(总预约时间最长),…...
Python | 排队取奶茶
队列的基本概念(队头、队尾)和特点(先入先出) 在 Python 语言中,标准库中的queue模块提供了多种队列的实现,比如普通队列和优先级队列,因此你可以使用queue.Queue类来创建队列,不过…...
mysql当前状态分析(show status)
文章目录 查看当前线程数据查询连接情况查询缓存相关查询锁相关查询增删改查执行次数查询DDL创建相关 SHOW STATUS 是一个在 MySQL 中用来查看服务器运行状态的命令。它可以帮助你了解服务器的当前性能,包括连接数、表锁定、缓冲区使用情况等信息。 查看当前线程数据…...
Google Earth Engine(GEE)——使用机器学习进行金三角大米分布图
第 1 步:转到https://code.earthengine.google.com/打开代码编辑器 第 2 步:使用以下代码从 Google Earth Engine Asset 导入数据 // 导入影像集合 var composites = ee.ImageCollection("projects/servir-mekong/yearlyComposites"); // 导入训练数据 var data …...
MyBatis一级和二级缓存介绍
MyBatis是一个持久层框架,它提供了一级缓存和二级缓存来提高数据库操作的性能。下面是一级缓存和二级缓存的区别理解、画图和知识点总结: 一级缓存: 一级缓存是MyBatis默认开启的缓存层,它是SqlSession级别的缓存,也…...
PowerDesigner遍历导出所有表结构到Excel
PowerDesigner遍历导出所有表到Excel 1.打开需要导出表结构到Excel的pdm文件 2.点击Tools|Execute Commands|Edit/Run Script菜单或按下快捷键Ctrl Shift X打开脚本窗口,输入示例VBScript脚本,修改其中的Excel模板路径及工作薄页签,点Run…...
JavaSE——抽象类和接口
目录 一 .抽象类 1.抽象类概念 2.抽象类语法 3.抽象类特性 4.抽象类的作用 二. 接口 1.接口的概念 2.语法规则 3.接口的使用 4.接口特性 5.实现多个接口 6.接口间的继承 三.抽象类和接口的区别 一 .抽象类 1.抽象类概念 在面向对象的概念中,所有的对…...
生成式人工智能 - stable diffusion web-ui安装教程
一、Stable Diffusion WEB UI 屌丝劲发作了,所以本地调试了Stable Diffusion之后,就去看了一下Stable Diffusion WEB UI,网络上各种打包套件什么的好像很火。国内的也就这个层次了,老外搞创新,国内跟着屁股后面搞搞应用层,就叫大神了。 不扯闲篇了,我们这里从git源码直接…...
11-Linux文件系统与日志分析
11.1深入理解Linux文件系统 在处理Liunx系统出现故障时,故障的症状是最易发现。数学LInux系统中常见的日志文件,可以帮助管理员快速定位故障点,并及时解决各种系统问题。 11.1.1 inode与block详解 文件系统通常会将这两部分内容分别存放在…...
mac M1下安装PySide2
在M1下装不了PySide2, 是因为PySide2没有arm架构的包 1 先在M1上装qt5 安装qt主要是为了能用里面的Desinger, uic, rcc brew install qt5 我装完的路径在/opt/homebrew/opt/qt5 其中Designer就是用来设计界面的 rcc用resource compiler, 编绎rc资源文件的, 生成对应的py文件…...
超详解——识别None——小白篇
目录 1. 内建类型的布尔值 2. 对象身份的比较 3. 对象类型比较 4. 类型工厂函数 5. Python不支持的类型 总结: 1. 内建类型的布尔值 在Python中,布尔值的计算遵循如下规则: None、False、空序列(如空列表 [],空…...
C++的MQTT开发:使用Paho的C++接口实现消息发布、订阅、连接RabbitMQ
C Paho实现MQTT消息发布功能 要使用paho的cpp接口实现发布MQTT消息的功能,需要进行以下步骤: 安装paho库:首先从paho官方网站下载并安装paho的C库。可以从https://www.eclipse.org/paho/clients/cpp/ 下载适合操作系统的版本。 创建MQTT客户…...
深度网络学习笔记(二)——Transformer架构详解(包括多头自注意力机制)
Transformer架构详解 前言Transformer的整体架构多头注意力机制(Multi-Head Attention)具体步骤1. 步骤12. 步骤23. 步骤34. 步骤4 Self-Attention应用与比较Self-Attention用于图像处理Self-Attention vs. CNNSelf-Attention vs. RNN Transformer架构详…...
Python 快速查找并替换Excel中的数据
Excel中的查找替换是一个非常实用的功能,能够帮助用户快速完成大量数据的整理和处理工作,避免手动逐一修改数据的麻烦,提高工作效率。要使用Python实现这一功能, 我们可以借助Spire.XLS for Python 库,具体操作如下&am…...
KafkaStream Local Store和Global Store区别和用法
前言 使用kafkaStream进行流式计算时,如果需要对数据进行状态处理,那么常用的会遇到kafkaStream的store,而store也有Local Store以及Global Store,当然也可以使用其他方案的来进行状态保存,文本主要理清楚kafkaStream…...
PowerDesigner导入Excel模板生成数据表
PowerDesigner导入Excel模板生成数据表 1.准备好需要导入的Excel表结构数据,模板内容如下图所示 2.打开PowerDesigner,新建一个physical data model文件,填入文件名称,选择数据库类型 3.点击Tools|Execute Commands|Edit/Run Script菜单或按下快捷键Ctrl Shift X打开脚本窗口…...
STM32 HAL库开发——入门篇(3):OLED、LCD
源自正点原子视频教程: 【正点原子】手把手教你学STM32 HAL库开发全集【真人出镜】STM32入门教学视频教程 单片机 嵌入式_哔哩哔哩_bilibili 一、OLED 二、内存保护(MPU)实验 2.1 内存保护单元 三、LCD 3.1 显示屏分类 3.2 LCD简介 3.3 LCD…...
在Linux中查找文件命令的几种方法
要在Linux中查找文件,可以使用以下几种不同的实现方法: 1. 使用find命令: find <搜索路径> <搜索选项> <搜索条件><搜索路径>:表示要搜索的起始路径,可以是一个具体的目录路径,也…...
【TB作品】MSP430F5529 单片机,温度控制系统,DS18B20,使用MSP430实现的智能温度控制系统
作品功能 这个智能温度控制系统基于MSP430单片机设计,能够实时监测环境温度并根据预设的温度报警值自动调节风扇和加热片的工作状态。主要功能包括: 实时显示当前温度。通过OLED屏幕显示温度报警值。通过按键设置温度报警值。实际温度超过报警值时&…...
立创小tips
立创小tips 原理图中 1-修改图纸属性 保存完,绘制原理图的界面就出现了,然后我们鼠标点击原理图的边缘变成红色就可以高边表格的属性了。 2-鼠标右键可以移动整个原理图 3-查看封装 点击任意一个元器件,在右侧就会显示封装属性ÿ…...
Html/HTML5常用标签的学习
课程目标 项目实战,肯定就需要静态网页。朝着做项目方式去学习静态网页。 01、编写第一个html工程结构化 cssjsimages/imgindex.html 归档存储和结构清晰就可以。 02、HTML标签分类 认知:标签为什么要分类,原因因为:分门别类…...
Tomcat 配置:一文掌握所有要点
引言 Apache Tomcat 是一个流行的开源 Java Servlet 容器和 Web 服务器,广泛用于开发和部署 Java Web 应用程序。正确配置 Tomcat 是确保其性能、安全性和稳定性的关键。本文将详细介绍 Tomcat 的各项配置,帮助您优化和管理 Tomcat 服务器。 一、Tomca…...
工商网站如何做企业增资/北京网站优化怎么样
一 故障现象:硬盘灯告警二 故障分析:硬盘fault三 处理过程:现场查看发现主机配置两块300GB硬盘,且系统正常运行。判断主机应该做了riad 1(fdisk -l命令显示逻辑盘的大小为300GB)在线更换硬盘more /var/log/…...
wordpress瀑布流/网站优化入门免费教程
2.请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy function replaceSpace(str) {return str.replace(/\s/g,%20) } 转载于:https://www.cnblogs.com/manru75/p/10260331…...
做英语题目的网站/百度做广告怎么做
JVM监控工具 Java的安装包自带了很多优秀的工具,善用这些工具对于监控和调试Java程序非常有帮助。常用工具如下: jps 用途:jps用来查看JVM里面所有进程的具体状态, 包括进程ID,进程启动的路径等等。 常用参数: -l: 输…...
服务器上如何建设多个网站/网站seo基础优化
网友南京-李先森给了他收集的一些资料,如下: Buckets 对指定列计算 hash,根据 hash 值切分数据,目的是为了并行,每一个 Bucket 对应一个文件。如将 user 列分散至 32 个 bucket,首先对 user 列的值计算 has…...
网站 外包方案/怎么创建网站平台
题目描述 小明很喜欢3和5这两个数字,他将能被3或5整除的数叫做美丽数。现在给你一个整数N(1<N<100000),你能告诉小明第N个美丽数是多少吗? 输入 输入包含多组测试数据。每组输入一个整数N(1<N<…...
商城网站建设计划书/全国免费发布广告信息平台
《.net, 哥已心灰意冷》,这位哥哥说了那么多,其实也没有能证明他所面对的问题是.net带来的。 其实,每一段时间都有人讨论这个问题,有些人是真的讨论了.net和java之类的技术上的差别,但是我发觉人们关心的并…...