使用 Go 写入文件
在本教程中,我们将学习如何使用 Go 将数据写入文件。我们还将学习如何同时写入文件。
本教程有以下部分
- 将字符串写入文件
- 将字节写入文件
- 逐行将数据写入文件
- 附加到文件
- 同时写入文件
由于 Playground 不支持文件操作,请在本地系统中运行本教程的所有程序。
将字符串写入文件
最常见的文件写入操作之一是将字符串写入文件。这很简单。它由以下步骤组成。
- 创建文件
- 将字符串写入文件
让我们立即开始讨论代码。
package mainimport ("fmt""os"
)func main() {f, err := os.Create("test.txt")if err != nil {fmt.Println(err)return}l, err := f.WriteString("Hello World")if err != nil {fmt.Println(err)f.Close()return}fmt.Println(l, "bytes written successfully")err = f.Close()if err != nil {fmt.Println(err)return}
}
上面程序第 9 行中的函数创建了一个名为 test.txt 的文件。如果具有该名称的文件已存在,则 create 函数将截断该文件。此函数返回 File 描述符。https://pkg.go.dev/os#File)。
在第 14 行,我们使用 方法将字符串Hello World写入文件WriteString。此方法返回写入的字节数和错误(如果有)。
最后,我们关闭第 1 行的文件。21.
上面的程序会打印
11 bytes written successfully
您可以找到在执行该程序的目录中创建的名为test.txt的文件。如果使用任何文本编辑器打开该文件,您可以发现它包含文本Hello World。
将字节写入文件
将字节写入文件与将字符串写入文件非常相似。我们将使用 Write 方法将字节写入文件。以下程序将字节切片写入文件。
package mainimport ("fmt""os"
)func main() {f, err := os.Create("/home/naveen/bytes")if err != nil {fmt.Println(err)return}d2 := []byte{104, 101, 108, 108, 111, 32, 98, 121, 116, 101, 115}n2, err := f.Write(d2)if err != nil {fmt.Println(err)f.Close()return}fmt.Println(n2, "bytes written successfully")err = f.Close()if err != nil {fmt.Println(err)return}
}
在上面的程序中,在第 15 行中,我们使用 Write 方法将字节切片写入目录中命名的文件。您可以将此目录更改为其他目录。其余程序是不言自明的。该程序将打印并创建一个名为 .打开文件,您可以看到它包含文本
逐行将字符串写入文件
另一种常见的文件操作是需要将字符串逐行写入文件。在本节中,我们将编写一个程序来创建包含以下内容的文件。
Welcome to the world of Go.
Go is a compiled language.
It is easy to learn Go.
让我们立即开始讨论代码。
package mainimport ("fmt""os"
)func main() {f, err := os.Create("lines")if err != nil {fmt.Println(err)f.Close()return}d := []string{"Welcome to the world of Go1.", "Go is a compiled language.", "It is easy to learn Go."}for _, v := range d {fmt.Fprintln(f, v)if err != nil {fmt.Println(err)return}}err = f.Close()if err != nil {fmt.Println(err)return}fmt.Println("file written successfully")
}
在上面程序的第 9 行中,我们创建了一个名为 lines 的新文件。在第 17 行中,我们使用 for range 循环遍历数组,并使用 Fprintln 函数将行写入文件。Fprintln 函数将 a 作为参数并附加一个新行,这正是我们想要的。运行此程序将打印,并在当前目录中创建一个文件。该文件的内容如下
Welcome to the world of Go1.
Go is a compiled language.
It is easy to learn Go.
追加到文件
在本节中,我们将在上一节中创建的文件后再附加一行。我们将在文件后面附加一行文件处理很容易。
文件必须以追加和只写模式打开。这些标志作为参数传递给 Open 函数。在追加模式下打开文件后,我们将新行添加到文件中。
package mainimport ("fmt""os"
)func main() {f, err := os.OpenFile("lines", os.O_APPEND|os.O_WRONLY, 0644)if err != nil {fmt.Println(err)return}newLine := "File handling is easy."_, err = fmt.Fprintln(f, newLine)if err != nil {fmt.Println(err)f.Close()return}err = f.Close()if err != nil {fmt.Println(err)return}fmt.Println("file appended successfully")
}
在上面程序的第 9 行中,我们以追加和只写模式打开文件。文件打开成功后,我们在第 15 行的文件中添加一个新行。该程序将打印 .运行此程序后,文件的内容将是
Welcome to the world of Go1.
Go is a compiled language.
It is easy to learn Go.
File handling is easy.
并发写入文件
当多个goroutine同时写入文件时,我们最终会遇到竞争条件。因此,必须使用通道来协调对文件的并发写入。
我们将编写一个创建 100 个 goroutine 的程序。每个 goroutine 都会同时生成一个随机数,总共生成一百个随机数。这些随机数将被写入文件中。我们将使用以下方法解决竞争条件问题。
- 创建一个用于读取和写入生成的随机数的通道。
- 创建 100 个生产者 goroutine。每个 goroutine 都会生成一个随机数,并将该随机数写入通道。
- 创建一个消费者 goroutine,将从通道读取数据并将生成的随机数写入文件。因此,我们只有一个 goroutine 同时写入文件,从而避免竞争条件
- 完成后关闭文件。
让我们produce首先编写生成随机数的函数。
func produce(data chan int, wg *sync.WaitGroup) {n := rand.Intn(999)data <- nwg.Done()
}
上面的函数生成一个随机数并将其写入通道data,然后调用Done等待组以通知其任务已完成。
现在让我们转到写入文件的函数。
func consume(data chan int, done chan bool) {f, err := os.Create("concurrent")if err != nil {fmt.Println(err)return}for d := range data {_, err = fmt.Fprintln(f, d)if err != nil {fmt.Println(err)f.Close()done <- falsereturn}}err = f.Close()if err != nil {fmt.Println(err)done <- falsereturn}done <- true
}
该consume函数创建一个名为concurrent. 然后它从通道读取随机数data并写入文件。一旦它读取并写入了所有随机数,它就会写入true通道done以通知它已完成其任务。
让我们编写main函数并完成这个程序。我在下面提供了整个程序。
package mainimport ("fmt""math/rand""os""sync"
)func produce(data chan int, wg *sync.WaitGroup) {n := rand.Intn(999)data <- nwg.Done()
}func consume(data chan int, done chan bool) {f, err := os.Create("concurrent")if err != nil {fmt.Println(err)return}for d := range data {_, err = fmt.Fprintln(f, d)if err != nil {fmt.Println(err)f.Close()done <- falsereturn}}err = f.Close()if err != nil {fmt.Println(err)done <- falsereturn}done <- true
}func main() {data := make(chan int)done := make(chan bool)wg := sync.WaitGroup{}for i := 0; i < 100; i++ {wg.Add(1)go produce(data, &wg)}go consume(data, done)go func() {wg.Wait()close(data)}()d := <-doneif d {fmt.Println("File written successfully")} else {fmt.Println("File writing failed")}
}
main 函数在第 41 行创建通道,从中读取和写入随机数。第 42 行中的通道被 goroutine 用来通知它已完成其任务。第 43 行中的等待组用于等待所有 100 个 goroutines 完成随机数的生成。
第 44 行中的循环创建了 100 个 goroutine。第 49 行中的 goroutine 调用要求等待组等待所有 100 个 goroutine 完成创建随机数。之后,它关闭通道。一旦通道关闭并且 goroutine 将所有生成的随机数写入文件,它就会写入第 37 行中的通道,并且主 goroutine 被解锁并打印。
现在您可以在任何文本编辑器中并发打开文件并查看生成的 100 个随机数:)
本教程到此结束。希望您喜欢阅读。祝你有美好的一天。
相关文章:
使用 Go 写入文件
在本教程中,我们将学习如何使用 Go 将数据写入文件。我们还将学习如何同时写入文件。 本教程有以下部分 将字符串写入文件将字节写入文件逐行将数据写入文件附加到文件同时写入文件 由于 Playground 不支持文件操作,请在本地系统中运行本教程的所有程…...
调用DeleteLocalRef的正确姿势
做安卓jni相关开发的总会在涉及到jni变量释放时怀疑人生,what? where? when? who? why? how? how much? 最近碰到一个比较奇怪的问题,有一个jni方法的耗时在随着调用次数的增加而上涨,但是没有明显的内存泄漏,经过我缜密分…...
抖音小店从0到1起店流程,实操经验分享!
我是电商珠珠 很多人在开店之后,并不知道怎么做。往往会有人跑来问我说,开店之后怎么做啊,流程方面我还不是很熟悉啊等等。 这份起店流程备好了,将来对你有用。 第一步,店铺基础设置 在店铺开好之后,不…...
MySQL权限
权限 MySQL 允许客户端用户连接到服务器并访问服务器管理数据,MySQL 用户权限系统的主要功能是对给定主机连接的用户进行身份验证,并将该用户与数据库的权限相关联。 在 MySQL8 之前,授权表使用 MyISAM 并且是非事务性的,在 MyS…...
Nginx服务器安装证书并启用SSL(acme.sh)
前提 您已购置vps服务器,例如阿里云全球站ecs、AWS EC2、Azure VM、GCP Compute等安全组已开启80、443端口,且访问源设置为0.0.0.0/0域名已设置A记录指向当前操作服务器,若您使用aws ec2,有公有 IPv4 DNS,可供使用 安…...
c++实现观察者模式
前言 我觉得这是最有意思的模式,其中一个动,另外的自动跟着动。发布-订阅,我觉得很巧妙。 代码 头文件 #pragma once #include<vector> #include<string> #include<iostream>// 抽象观察者 class Aobserver { public:v…...
C 语言左移位操作在kernel驱动子系统中的特殊用途
文章目录 前言一、C语言左移位操作介绍1. 左移位二、左移位操作在kernel 驱动子系统中的应用1. 左移位操作在 V4L2, Media 子系统中的应用实例2.左移位操作在 DRM 子系统中的应用实例2.1 左移位操作在struct drm_crtc 中的应用2.2 左移位操作在struct drm_encoder 中的应用总结…...
kafka3.6.0集群部署
环境准备 机器环境 系统主机名IP地址centos7.9kafka01192.168.200.51centos7.9kafka02192.168.200.52centos7.9kafka03192.168.200.53 所需软件 jdk-8u171-linux-x64.tar.gzapache-zookeeper-3.8.3-bin.tar.gz https://dlcdn.apache.org/zookeeper/zookeeper-3.8.3/apache-zook…...
JAVA客户端使用账号密码调用influxdb2报错:{“code“:“unauthorized“,“message“:“Unauthorized“}
问题:JAVA客户端访问influxdb2报错 说明:当前influxdb版本:2.6.1 使用依赖: <dependency><groupId>org.influxdb</groupId><artifactId>influxdb-java</artifactId><version>2.10</vers…...
Mysql查询今天到期、n天即将到期、还有n天过期相关sql
超级治愈的一段话 其实你已经很幸福了,吃饱穿暖,没病没灾,隔三岔五还能吃顿好的,偶尔还能睡到自然醒,肥嘟嘟的一身福气。人这一辈子,要是能够逃过天灾,躲过战乱,不遇歹人,不生大病,就已经是非常幸运了,要是还能家庭和谐,收人稳定,三五知己,那更是天大的福泽。 -…...
【漏洞复现】Apache Log4j Server 反序列化命令执行漏洞(CVE-2017-5645)
感谢互联网提供分享知识与智慧,在法治的社会里,请遵守有关法律法规 文章目录 1.1、漏洞描述1.2、漏洞等级1.3、影响版本1.4、漏洞复现1、基础环境2、漏洞扫描3、漏洞验证 1.5、深度利用1、反弹Shell 说明内容漏洞编号CVE-2017-5645漏洞名称Log4j Server …...
【江协科技-用0.96寸OLED播放知名艺人打篮球视频】
Python进行视频图像处理,通过串口发送给stm32,stm32接收数据,刷新OLED进行显示。 步骤: 1.按照接线图连接好硬件 2.把Keil工程的代码下载到STM32中 3.运行Python代码,通过串口把处理后的数据发送给STM32进行显示 …...
CATIA环境编辑器用不了时创建项目快捷方式
CATIA环境编辑器用不了时创建项目快捷方式 一、参考适用情况示例二、 解决步骤(一) 先正确放置winb_64部署包(二) 添加环境文件(三) 修改加入的环境文件(四) 复制本机CATIA快捷方式后重命名(五) 修改快捷方式目标的值 一、参考适用情况示例 二、 解决步骤 (一) 先正确放置winb…...
java泛型的深入 泛型还可以在很多地方进行定义 泛型类 泛型方法 泛型接口 泛型的继承和通配符 泛型类练习
文章目录 泛型的深入泛型还可以在很多地方进行定义泛型类泛型方法泛型接口 泛型的继承和通配符泛型类练习总结 泛型的深入 public static void main(String[] args) {//在没有泛型的时候怎么存储数据ArrayList listnew ArrayList();list.add(1);list.add("abc");//遍…...
持续交付的好处
在软件领域,持续交付就是这样一种开发实践,它为所有利益相关者带来好处:开发、运营、测试人员和业务团队。持续交付适用于每个由软件驱动的组织;很难想象企业不使用软件。 它使人们受益,并需要人们做出改变才能更好地…...
APP开发:用途与未来前景|软件定制开发|网站小程序建设
APP开发:用途与未来前景|软件定制开发|网站小程序建设 APP开发已成为现代科技趋势的一部分,无论是日常生活还是商业领域,都有它的身影。通过开发APP,我们可以将想法、功能和内容转化为直观、易用的移动设备应用程序,满…...
图论——并查集
参考内容: 图论——并查集(详细版) 并查集(Disjoint-set)是一种精巧的树形数据结构,它主要用于处理一些不相交集合的合并及查询问题。一些常见用途,比如求联通子图、求最小生成树的 Kruskal 算法和求最近公共祖先&…...
计算机毕业设计java+vue+springboot的论坛信息网站
项目介绍 本论文系统地描绘了整个网上论坛管理系统的设计与实现,主要实现的功能有以下几点:管理员;首页、个人中心、用户管理、公告管理、公告类型管理、热门帖子管理、帖子分类管理、留言板管理、论坛新天地、我的收藏管理、系统管理&#…...
.net core添加SQL日志输出
GreDbContext : Microsoft.EntityFrameworkCore.DbContext 下添加 public static readonly ILoggerFactory MyLoggerFactory LoggerFactory.Create(builder > { builder.AddConsole(); }); protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder…...
虚幻5.1 常见的效果关闭方式
常见的虚幻效果关闭方式 1.Bloom ProjectSettings->Rendering->Default Settings->Bloom PostProcessVolume->Lens->Bloom 2.Ambient Occlusion/Screen Space Ambient Occlusion(SSAO) ProjectSettings->Rendering->Default Settings->Ambient Occl…...
观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...
Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...
centos 7 部署awstats 网站访问检测
一、基础环境准备(两种安装方式都要做) bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats࿰…...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...
Docker 本地安装 mysql 数据库
Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker ;并安装。 基础操作不再赘述。 打开 macOS 终端,开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...
【Go语言基础【12】】指针:声明、取地址、解引用
文章目录 零、概述:指针 vs. 引用(类比其他语言)一、指针基础概念二、指针声明与初始化三、指针操作符1. &:取地址(拿到内存地址)2. *:解引用(拿到值) 四、空指针&am…...
七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...
【JVM面试篇】高频八股汇总——类加载和类加载器
目录 1. 讲一下类加载过程? 2. Java创建对象的过程? 3. 对象的生命周期? 4. 类加载器有哪些? 5. 双亲委派模型的作用(好处)? 6. 讲一下类的加载和双亲委派原则? 7. 双亲委派模…...
