7天玩转 Golang 标准库之 os

在 Golang 的日常开发中,往往要面对各种和操作系统相关的操作,例如文件的读写、环境变量的处理、程序参数的获取等等。Golang 的
os 标准库为我们提供了与操作系统打交道的各类工具,能让这些操作变得更加简洁和简单。

基础应用

文件的读写操作

在进行文件操作时,“读” 和 “写” 是最常见且重要的两个操作。

下面是一个如何读取文件和写入文件的基本样例:

package main import ("fmt""io/ioutil""os"
)func main() {content := []byte("Hello Golang!")// 写入文件err := ioutil.WriteFile("/tmp/golang.txt", content, 0644)if err != nil {fmt.Printf("Error writing file: %v", err)}// 读取文件data, err := ioutil.ReadFile("/tmp/golang.txt")if err != nil {fmt.Printf("Error reading file: %v", err)}fmt.Printf("File content: %s", data)
}

当然,上述内容只是文件读写的基础操作,有更复杂的读写需求(例如需要同时进行读写)时,可以使用 os 包中其它的工具函数,如os.Openos.Create等。

环境变量的操作

环境变量是运行时系统或应用中的一种参数,一般用来告诉应用或库它们应该如何表现。因此,理解如何在Go中操作环境变量是很重要的。下面的例子演示了如何获取、设置和列出环境变量:

package mainimport ("fmt""os"
)func main() {// 设置环境变量os.Setenv("GO_ENV", "production")// 获取环境变量fmt.Println("GO_ENV:", os.Getenv("GO_ENV"))// 迭代并打印所有环境变量for _, env := range os.Environ() {fmt.Println(env)}
}

命令行参数的获取

在写命令行应用的时候,我们通常需要接收并处理命令行参数。我们可以使用 os.Args 来获取命令行参数。

package mainimport ("fmt""os"
)func main() {// os.Args 提供原始命令行参数访问功能。注意,切片的第一个参数是该程序的路径,并且 `os.Args[1:]` 会得到所有程序的的参数。argsWithProg := os.ArgsargsWithoutProg := os.Args[1:]// 你可以使用标准的索引位置方式取得单个参数的值。arg := os.Args[3]fmt.Println(argsWithProg)fmt.Println(argsWithoutProg)fmt.Println(arg)
}

好的,接下来我会把高级应用部分进行完善,包括进程管理、信号处理和文件锁等用法。

进阶应用

进程管理

以Go语言编写的程序本身就是一个进程,此外,你还可以创建和管理其他的进程。Golang的os/exec标准库封装了创建和管理进程的一系列功能,具体使用可以参考以下例子:

package mainimport ("fmt""os""os/exec"
)func main() {fmt.Printf("我是父进程: %v\n", os.Getpid())cmd := exec.Command("sleep", "5")if err := cmd.Start(); err != nil {fmt.Printf("出错了:%v\n", err)os.Exit(1)}fmt.Printf("我创建的子进程ID为: %v\n", cmd.Process.Pid)cmd.Wait()fmt.Printf("子进程已经结束\n")
}

在代码中我们创建了一个新的shell命令进程sleeep 5,等待它的结束。

Signal处理

在使用操作系统API时,会经常和一系列信号进行交互,比如SIGTERM表示终止进程的信号,在Go语言的os/signal库中我们可以方便的处理系统信号:

package mainimport ("fmt""os""os/signal""syscall"
)func main() {sigs := make(chan os.Signal, 1)done := make(chan bool, 1)// 注册你所关注的信号signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)go func() {sig := <-sigsfmt.Println()fmt.Println(sig)done <- true}()fmt.Println("等待信号")<-donefmt.Println("退出")
}

上述程序会一直等待,直到接收到SIGINTSIGTERM信号。

文件锁

有时我们需要防止两个进程同时操作同一个文件,Go可以使用os.OpenFilesyscall.Flock提供简单的文件锁:

package main import ("fmt""os""syscall"
)func main() {f, err := os.OpenFile("/tmp/go-lock.tmp", os.O_CREATE | os.O_RDWR, 0600)if err != nil {fmt.Printf("open file error: %v\n", err)return}defer f.Close()err = syscall.Flock(int(f.Fd()), syscall.LOCK_EX|syscall.LOCK_NB)if err != nil {if err == syscall.EWOULDBLOCK {fmt.Println("文件已经被锁定")return}fmt.Printf("锁定文件失败:%v\n", err)return}defer syscall.Flock(int(f.Fd()), syscall.LOCK_UN)fmt.Println("成功锁定文件")
}

在这个例子中,我们试图获得一个文件锁,如果文件已经被其他进程锁定,程序将会返回错误信息。

以上就是使用Golang os库进行操作系统调用的高级操作方式,希望对你有所帮助,请一键三连哦~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/584709.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第八周:AIPM面试准备

以下为从开始准备转行到拿到offer期间每天需要准备的10个面试题目以及相关知识补充&#xff01;来源广泛&#xff0c;从各个地方收集&#xff0c;只提供题目&#xff0c;我自己的尝试回答也会陆续放在我的喜马拉雅&#xff0c;基于我粗浅的认知&#xff0c;分享我粗浅的作答思路…

------- 计算机网络基础

1.1概述 是什么? 答出独立计算机通信线路连接实现资源共享 计算机网络组成 从组成部分看: 硬件软件协议 从工作方式看: 边缘部分和核心部分 从功能组成看: 通信子网和资源子网 计算机网络性能指标 速率是指数据传输的物理速度&#xff0c;吞吐量是指实际的数据传输…

k8s的陈述式资源管理(命令行操作)

&#xff08;一&#xff09;k8s的陈述式资源管理 1、命令行&#xff1a;kubectl命令行工具——用于一般的资源管理 &#xff08;1&#xff09;优点&#xff1a;90%以上ce场景都可以满足 &#xff08;2&#xff09;特点&#xff1a;对资源的增、删、查比较方便&#xff0c;对…

如何使用idea部署springboot项目全过程

博主介绍&#xff1a; ✌至今服务客户已经1000、专注于Java技术领域、项目定制、技术答疑、开发工具、毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精彩专栏 推荐订阅 &#x1f447;&#x1f3fb; 不然下次找不到 Java项目精品实…

如果SSE推送不稳定,是不是可以考虑切换成WebSocket,各自有什么优缺点

面对 Server-Sent Events (SSE) 推送不稳定的情况时&#xff0c;可以考虑切换到 WebSocket。SSE 和 WebSocket 都是现代Web应用中用于实现实时通信的技术&#xff0c;但它们有各自的优缺点和最适用的场景。 Server-Sent Events (SSE) 优点 简单性&#xff1a;SSE 在使用上比…

Adobe 设计精髓:创新的用户体验 | 开源日报 No.130

adobe/react-spectrum Stars: 10.1k License: Apache-2.0 React Spectrum Libraries 是一系列的库和工具&#xff0c;旨在帮助开发者构建适应性强、可访问性好且稳健的用户体验。 核心优势&#xff1a; 提供全面的可访问性和行为支持&#xff0c;符合 WAI-ARIA 编写实践&…

vcpkg 安装开源包 以及 配置 已解决

Vcpkg 可帮助您在 Windows、 Linux 和 MacOS 上管理 C 和 C 库。 这个工具和生态链正在不断发展&#xff0c;我们一直期待您的贡献&#xff01; 若您从未使用过 vcpkg&#xff0c;或者您正在尝试了解如何使用 vcpkg&#xff0c;请查阅 入门 章节。 如需获取有关可用命令的简短…

大创项目推荐 深度学习乳腺癌分类

文章目录 1 前言2 前言3 数据集3.1 良性样本3.2 病变样本 4 开发环境5 代码实现5.1 实现流程5.2 部分代码实现5.2.1 导入库5.2.2 图像加载5.2.3 标记5.2.4 分组5.2.5 构建模型训练 6 分析指标6.1 精度&#xff0c;召回率和F1度量6.2 混淆矩阵 7 结果和结论8 最后 1 前言 &…

[数据集][目标检测]车辆检测数据集VOC+YOLO格式1.6w张3类别

一共分为3个压缩包&#xff1a; 【车辆检测数据集AVOCYOLO格式5423张3类别】 数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;5423 标注数…

线上问题复盘记录

cust_id误刷问题 问题原因&#xff1a;错误的update语句&#xff0c;导致本来更新一条数据的&#xff0c; 结果更新了全表 解决措施&#xff1a;找DBA从备份库&#xff0c;将生产库cust_id为0的数据&#xff0c;恢复到误刷前一秒的cust_id 后续改进&#xff1a; 禁止以任意…

Animate 2024(Adobe an2024)

Animate 2024是一款由Adobe公司开发的动画和互动内容创作工具&#xff0c;是Flash的演进版本。Animate 2024为设计师和开发者提供了更丰富的功能&#xff0c;让他们能够创建各种类型的动画、交互式内容和多媒体应用程序。 Animate 2024具有以下特点&#xff1a; 强大的设计工…

k8s的资源管理

命令行: kubectl命令行工具优点: 90%以上的场景都可以满足 对资源的增&#xff0c;删&#xff0c;查比较方便&#xff0c;对改不是很友好缺点:命令比较冗长&#xff0c;复杂难记 声明方式&#xff1a;k8s当中的yaml文件实现资源管理----声明式GUI:图形化工具的管理。 查看k8s的…

【数据挖掘】模型融合

模型融合是指将多个不同的机器学习模型组合起来&#xff0c;通过综合多个模型的预测结果来得到更准确的预测结果。模型融合可以提高模型的鲁棒性&#xff0c;减小模型的方差&#xff0c;提高模型的泛化能力。 常见的模型融合方法包括平均法、投票法和堆叠法。 平均法(Averagin…

PiflowX组件-WriteToKafka

WriteToKafka组件 组件说明 将数据写入kafka。 计算引擎 flink 有界性 Streaming Append Mode 组件分组 kafka 端口 Inport&#xff1a;默认端口 outport&#xff1a;默认端口 组件属性 名称展示名称默认值允许值是否必填描述例子kafka_hostKAFKA_HOST“”无是逗号…

使用Commons JXPath简化XML/JSON处理

第1章&#xff1a;引言 咱们都知道&#xff0c;在现代软件开发中&#xff0c;处理XML和JSON数据几乎是家常便饭。这两种格式广泛应用于配置文件、数据交换、API响应等领域。不过&#xff0c;要手动解析和操作它们&#xff0c;有时候真是让人头大。 当你面对一堆复杂的XML或JS…

JavaSE语法之十一:接口(超全!!!)

文章目录 1. 概念2. 语法规则3. 接口使用4. 接口特性5. 实现多个接口6. 接口间的继承7. 接口使用实例8. Clonable 接口和深拷贝9. 抽象类和接口的区别&#xff08;重要&#xff01;&#xff09; 1. 概念 在现实生活中的接口比比皆是&#xff0c;如&#xff1a;笔记本上的USB接…

Flink 输出至 Elasticsearch

【1】引入pom.xml依赖 <dependency><groupId>org.apache.flink</groupId><artifactId>flink-connector-elasticsearch6_2.12</artifactId><version>1.10.0</version> </dependency>【2】ES6 Scala代码&#xff0c;自动导入的…

私有部署ELK,搭建自己的日志中心(五)-- 使用filebeat采集K8S pod的jvm日志

一、背景 前文采集的日志是来源于虚拟机&#xff0c;在云原生下的容器化部署时&#xff0c;需要采集Pod里的jvm日志。 二、术语 1、临时存储emptyDir emptyDir在Pod被分配到Node时创建的&#xff0c;它的初始内容为空&#xff0c;并且无须指定宿主机上对应的目录文件&#…

2. 云原生实战之kubesphere搭建

文章目录 机器介绍centos基本配置安装 VMware Tools设置静态ip关闭防火墙关闭SELinux开启时间同步配置host和hostname 安装kubesphere依赖项安装配置文件准备执行安装命令 机器介绍 在ESXI中准备虚拟机&#xff0c;部署参考官网&#xff1a;https://kubesphere.io/zh/ CentOs…

分布式系统架构设计之分布式系统架构演进和版本管理

在分布式系统的生命周期中&#xff0c;架构演进和版本管理是很重要的两个环节。本部分会介绍分布式系统架构演进的原则、策略以及版本管理的最佳实践&#xff0c;以帮助研发团队更好地应对需求变化、技术发展和系统升级。 架构演进 演进原则 渐进式演进 采用渐进式演进的原…