Golang os模块功能详解与示例
os 是 Go 语言标准库中与操作系统交互的核心模块,提供了丰富的功能来操作文件系统、进程、环境变量等。下面我将详细介绍 os 模块的主要功能,并提供相应的代码示例。
1. 文件与目录操作
1.1 文件操作
创建文件
package mainimport ("fmt""os"
)func main() {file, err := os.Create("test.txt")if err != nil {fmt.Println("Error creating file:", err)return}defer file.Close()fmt.Println("File created successfully")
}
打开文件
func main() {// 只读方式打开file, err := os.Open("test.txt")if err != nil {fmt.Println("Error opening file:", err)return}defer file.Close()// 读写方式打开file, err = os.OpenFile("test.txt", os.O_RDWR|os.O_CREATE, 0644)if err != nil {fmt.Println("Error opening file:", err)return}defer file.Close()
}
文件信息
func main() {fileInfo, err := os.Stat("test.txt")if err != nil {fmt.Println("Error getting file info:", err)return}fmt.Println("File name:", fileInfo.Name())fmt.Println("Size:", fileInfo.Size(), "bytes")fmt.Println("Permissions:", fileInfo.Mode())fmt.Println("Last modified:", fileInfo.ModTime())fmt.Println("Is directory:", fileInfo.IsDir())
}
读写文件
func main() {// 写入文件err := os.WriteFile("test.txt", []byte("Hello, Go!"), 0644)if err != nil {fmt.Println("Error writing file:", err)return}// 读取文件data, err := os.ReadFile("test.txt")if err != nil {fmt.Println("Error reading file:", err)return}fmt.Println("File content:", string(data))
}
删除文件
func main() {err := os.Remove("test.txt")if err != nil {fmt.Println("Error removing file:", err)return}fmt.Println("File removed successfully")
}
1.2 目录操作
创建目录
func main() {// 创建单个目录err := os.Mkdir("mydir", 0755)if err != nil {fmt.Println("Error creating directory:", err)return}// 创建多级目录err = os.MkdirAll("parent/child/grandchild", 0755)if err != nil {fmt.Println("Error creating directories:", err)return}
}
读取目录
func main() {entries, err := os.ReadDir(".")if err != nil {fmt.Println("Error reading directory:", err)return}fmt.Println("Directory contents:")for _, entry := range entries {fmt.Println(entry.Name())}
}
删除目录
func main() {// 删除空目录err := os.Remove("mydir")if err != nil {fmt.Println("Error removing directory:", err)}// 递归删除目录及其内容err = os.RemoveAll("parent")if err != nil {fmt.Println("Error removing directories:", err)}
}
2. 环境变量操作
获取环境变量
func main() {// 获取单个环境变量path := os.Getenv("PATH")fmt.Println("PATH:", path)// 获取所有环境变量envs := os.Environ()for _, env := range envs {fmt.Println(env)}
}
设置环境变量
func main() {// 设置环境变量err := os.Setenv("MY_VAR", "my_value")if err != nil {fmt.Println("Error setting environment variable:", err)return}// 验证设置value := os.Getenv("MY_VAR")fmt.Println("MY_VAR:", value)// 取消设置err = os.Unsetenv("MY_VAR")if err != nil {fmt.Println("Error unsetting environment variable:", err)}
}
3. 进程操作
获取进程信息
func main() {// 当前进程IDpid := os.Getpid()fmt.Println("Process ID:", pid)// 父进程IDppid := os.Getppid()fmt.Println("Parent Process ID:", ppid)// 当前工作目录wd, err := os.Getwd()if err != nil {fmt.Println("Error getting working directory:", err)return}fmt.Println("Working Directory:", wd)// 用户信息fmt.Println("User ID:", os.Getuid())fmt.Println("Group ID:", os.Getgid())fmt.Println("Effective User ID:", os.Geteuid())fmt.Println("Effective Group ID:", os.Getegid())
}
修改工作目录
func main() {// 获取当前目录wd, _ := os.Getwd()fmt.Println("Current directory:", wd)// 修改工作目录err := os.Chdir("/tmp")if err != nil {fmt.Println("Error changing directory:", err)return}// 验证修改newWd, _ := os.Getwd()fmt.Println("New directory:", newWd)// 恢复原目录os.Chdir(wd)
}
退出进程
func main() {defer fmt.Println("This will not be printed")// 立即退出进程,不执行deferos.Exit(1)fmt.Println("This will not be printed either")
}
4. 文件权限与所有权
修改文件权限
func main() {// 创建测试文件os.WriteFile("permission.txt", []byte("test"), 0644)// 修改权限为只读err := os.Chmod("permission.txt", 0444)if err != nil {fmt.Println("Error changing permissions:", err)return}// 验证修改info, _ := os.Stat("permission.txt")fmt.Println("New permissions:", info.Mode())
}
修改文件所有者
func main() {// 创建测试文件os.WriteFile("owner.txt", []byte("test"), 0644)// 修改文件所有者// 注意: 通常需要root权限才能修改所有者err := os.Chown("owner.txt", 1000, 1000) // UID和GIDif err != nil {fmt.Println("Error changing owner:", err)}
}
5. 高级文件操作
文件链接
func main() {// 创建源文件os.WriteFile("source.txt", []byte("original content"), 0644)// 创建硬链接err := os.Link("source.txt", "hardlink.txt")if err != nil {fmt.Println("Error creating hard link:", err)}// 创建符号链接err = os.Symlink("source.txt", "symlink.txt")if err != nil {fmt.Println("Error creating symlink:", err)}// 读取符号链接指向的目标target, err := os.Readlink("symlink.txt")if err != nil {fmt.Println("Error reading symlink:", err)} else {fmt.Println("Symlink points to:", target)}
}
文件截断
func main() {// 创建测试文件os.WriteFile("truncate.txt", []byte("This is a long content"), 0644)// 截断文件为10字节err := os.Truncate("truncate.txt", 10)if err != nil {fmt.Println("Error truncating file:", err)return}// 验证结果data, _ := os.ReadFile("truncate.txt")fmt.Println("Truncated content:", string(data)) // 输出: "This is a"
}
6. 临时文件与目录
创建临时文件
func main() {// 在默认临时目录创建临时文件tempFile, err := os.CreateTemp("", "example.*.txt")if err != nil {fmt.Println("Error creating temp file:", err)return}defer os.Remove(tempFile.Name()) // 清理fmt.Println("Temp file name:", tempFile.Name())// 写入内容_, err = tempFile.Write([]byte("temporary content"))if err != nil {fmt.Println("Error writing to temp file:", err)}// 重置文件指针到开头tempFile.Seek(0, 0)// 读取内容content, _ := io.ReadAll(tempFile)fmt.Println("Temp file content:", string(content))
}
创建临时目录
func main() {// 在默认临时目录创建临时目录tempDir, err := os.MkdirTemp("", "example")if err != nil {fmt.Println("Error creating temp dir:", err)return}defer os.RemoveAll(tempDir) // 清理fmt.Println("Temp dir:", tempDir)// 在临时目录中创建文件tempFile := filepath.Join(tempDir, "test.txt")err = os.WriteFile(tempFile, []byte("test"), 0644)if err != nil {fmt.Println("Error creating file in temp dir:", err)}
}
7. 标准输入/输出/错误
func main() {// 标准输入、输出、错误fmt.Println("Standard Output")fmt.Fprintln(os.Stdout, "Also standard output")fmt.Fprintln(os.Stderr, "Standard Error")// 从标准输入读取fmt.Print("Enter text: ")scanner := bufio.NewScanner(os.Stdin)if scanner.Scan() {fmt.Println("You entered:", scanner.Text())}
}
8. 文件路径操作
虽然 path/filepath 包专门处理路径,但 os 也提供了一些基本功能:
获取可执行文件路径
func main() {// 获取当前可执行文件路径exePath, err := os.Executable()if err != nil {fmt.Println("Error getting executable path:", err)return}fmt.Println("Executable path:", exePath)
}
路径分隔符
func main() {fmt.Println("Path separator:", string(os.PathSeparator)) // 通常 "/" 或 "\"fmt.Println("Path list separator:", string(os.PathListSeparator)) // 通常 ":" 或 ";"
}
9. 信号处理
func main() {// 创建信号通道sigChan := make(chan os.Signal, 1)// 注册要接收的信号signal.Notify(sigChan, os.Interrupt, syscall.SIGTERM)fmt.Println("Waiting for signal... Press Ctrl+C to interrupt")// 阻塞等待信号sig := <-sigChanfmt.Printf("Received signal: %v\n", sig)// 执行清理工作...fmt.Println("Cleaning up...")
}
10. 用户与组查询
func main() {// 当前用户currentUser, err := user.Current()if err != nil {fmt.Println("Error getting current user:", err)return}fmt.Printf("Current user: %+v\n", currentUser)// 根据用户名查询用户userInfo, err := user.Lookup("root")if err != nil {fmt.Println("Error looking up user:", err)} else {fmt.Printf("Root user info: %+v\n", userInfo)}// 根据组ID查询组groupInfo, err := user.LookupGroupId(currentUser.Gid)if err != nil {fmt.Println("Error looking up group:", err)} else {fmt.Printf("Group info: %+v\n", groupInfo)}
}
总结
os 模块提供了与操作系统交互的丰富功能,包括:
- 文件系统操作:创建、读写、删除文件和目录
- 环境变量管理:获取、设置和取消设置环境变量
- 进程控制:获取进程信息、修改工作目录、退出进程
- 权限管理:修改文件权限和所有权
- 高级文件操作:链接、截断、临时文件
- 标准I/O:访问标准输入、输出和错误
- 信号处理:捕获和处理系统信号
- 用户/组查询:获取用户和组信息
这些功能使得 Go 程序能够与操作系统进行深度交互,实现各种系统级操作。在实际开发中,应结合 io、path/filepath 等相关包一起使用,以构建更强大的功能。
相关文章:
Golang os模块功能详解与示例
os 是 Go 语言标准库中与操作系统交互的核心模块,提供了丰富的功能来操作文件系统、进程、环境变量等。下面我将详细介绍 os 模块的主要功能,并提供相应的代码示例。 1. 文件与目录操作 1.1 文件操作 创建文件 package mainimport ("fmt"&…...
SICAR 标准 KUKA 机器人标准功能块说明手册
功能块名称:LSicar_Robot_KUKA_PrD 目录 1. 概述 2. 功能说明 2.1 程序控制 2.2 状态监控 2.3 报警与故障处理 2.4 驱动控制 3. 关键参数说明 4. 操作步骤指南 4.1 初始化配置 4.2 运行控制 4.3 状态监控 5. 常见故障处理 6. 注意事项 附录1:程序段索引 附录…...
linux中如何修改文件的权限和拥有者所属组
目录标题 chmod指令八进制形式权限修改文件拥有者所属组的修改umask有关内容 chmod指令 chmod指令可以用来修改人员的权限其形式如下: u代表的是拥有者,g代表的是所属组,o代表的是其他人,a表示所有人,如果你想增加权…...
掌握Linux项目自动化构建:从零入门make与Makefile
文章目录 前言: 一、初识自动化构建工具1.1 什么是make/Makefile?1.2 快速体验 二、深入理解核心机制2.1 依赖关系与依赖方法2.2 伪目标的妙用2.3 具体语法a.makefile的基本雏形b.makefile推导原则! 三、更加具有通用型的makefile1. 变量定义…...
Jenkins 配置python项目和allure
Jenkins新建项目 新建ry-api-auto-test。 添加项目描述,选择gitee令牌。 源码管理,设置仓库地址和凭证。参考我上一篇文章的链接:配置gitee私人令牌和凭证 构建步骤,因为我Jenkins部署在Windows,因此选择batch。…...
优化 Docker 镜像 技巧
优化 Docker 镜像可以提高构建速度、减少镜像大小、提高安全性和效率。以下是一些优化 Docker 镜像的方法: 使用适当的基础镜像 选择合适的基础镜像可以减小镜像大小,并确保基础镜像的安全性和更新性。Alpine、Ubuntu Minimal 等轻量级基础镜像是常用选…...
从简单场景认识建造者模式
建造者设计模式总的来说常见的形式无非就两种。 一种是具体产物样式多,故通过中间者(指挥者)来统筹决定产生哪种对象(组装电脑,都是电脑,只是参数配置不同)。 一种是构造的可选参数多…...
Maven工具学习使用(四)——仓库
仓库分类 对于Mavne来说,仓库只分为两类:本地仓库和远程仓库。当Maven根据坐标查询寻找构件的时候,它首先会查看本地仓库,如果本地仓库存在此构件,则直接使用;如果本地仓库不存在此构件,或者需要查看是否有更新的构件版本,Maven就会去远程仓库查找,发现需要的构件之后…...
vue3:十一、主页面布局(进入指定菜单页面,默认锁定到左侧菜单)
一、效果 直接进入home页面,直接展开对应的菜单项 二、具体实现 1、菜单容器增加默认选中变量 在菜单容器中将默认展开菜单default-openeds修改为默认选中菜单default-active 2、引入useRoute方法 引入该方法为了获取当前页面的路径 import { useRoute } from …...
linux,防火墙,firewall,常用命令
文章目录 1. 查看防火墙状态2. 查看当前开放的端口和服务查看所有开放的端口查看所有允许的服务查看所有区域的详细信息 3. 开放指定端口开放端口(临时生效)开放端口(永久生效)开放指定端口范围 4. 删除指定端口删除端口ÿ…...
SQL 函数
SQL 函数 概述 SQL 函数是数据库查询语言(Structured Query Language)的核心组成部分之一。它们是用于执行特定任务的预定义过程,可以在查询中使用以增强查询的灵活性和功能性。SQL 函数可以分为两大类:内置函数和用户自定义函数…...
【蓝桥杯】每日练习 Day13
前言 今天做了不少题,但是感觉都太水了,深思熟虑之下主播决定拿出两道相对不那么水的题来说一下(其实还是很水)。 两道问题,一道是日期问题(模拟),一道是区间合并问题。 日期差值 …...
【Docker系列七】Docker Compose 命令详解
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
【AI学习】Transformer 模型
1,概念 是一种基于自注意力机制(Self-Attention Mechanism)的深度学习架构,在自然语言处理、计算机视觉等多个领域都有着极为重要的应用。 2,基本结构 1)编码器(Encoder) 通常由多个相同的编码器层堆叠而成。 每个编码器层包含了多头自注意力机制、前馈神经网络以及…...
大数据学习栈记——HBase操作(shell java)
本文介绍HBase在shell终端的常见操作以及如何利用java api操作HBase,操作系统:Ubuntu24.04 参考: https://blog.51cto.com/u_16099228/8016429 https://blog.csdn.net/m0_37739193/article/details/73618899 https://cloud.tencent.com/d…...
React多层级对象改变值--immer
reduxjs/toolkit底层就是immer,,,所以在使用redux的时候,直接赋值,就会响应式的数据 如果不使用reduxjs/toolkit,可以自己使用immer来实现 安装immer npm install immer引入produce函数,,prod…...
服务器硬盘爆满100%问题解决
问题 在工作中遇到一个服务器,服务器硬盘100%,查找哪个目录文件中占用大量空间。发现加起来才150G,硬盘空间大概有500G。 处理问题,排查是否有某个进程正在删除文件,进程卡住了,所以过滤一下有哪些进程&am…...
智能制造:物联网和自动化之间的关系
工业自动化 工业自动化是机器设备或生产过程在不需要人工直接干预的情况下按预期的目标实现测量、操纵等信息处理和过程控制的统称。 在传统的工业生产过程中,很多环节需要人工操作,比如设备调试、生产监控、质量检测等。然而,随着工业自动化…...
Axure项目实战:智慧城市APP(三)教育查询(显示与隐藏交互)
亲爱的小伙伴,在您浏览之前,烦请关注一下,在此深表感谢! 课程主题:教育查询 主要内容:教育公告信息,小升初、初升高、高考成绩查询;教育公告信息为传统的信息页面,小升…...
01 设计模式和设计原则
类设计原则: 单一职责原则(Single Responsibility Principle,SRP):实现类要职责单一开闭原则(Open Close Principle,OCP):对扩展开放,对修改关闭里氏替换原则…...
Github 2025-03-23 php开源项目日报Top10
根据Github Trendings的统计,今日(2025-03-23统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量PHP项目10TypeScript项目1JavaScript项目1Shell项目1Laravel: 以优雅语法简化Web开发 创建周期:4028 天开发语言:PHP协议类型:MIT LicenseSt…...
macbook电脑如何清理键盘防止误触
M1芯片的MacBook电脑关机后按任意键开机,是苹果的功能设计。这样设计的目的是为了方便用户,让用户在想要使用电脑时能快速开机。但是清理电脑键盘的时候却成为了一种苦恼 以下是一些清理 MacBook 键盘防止误触的方法: 使用工具锁定键盘 Cle…...
AIMB-ASMB-788B(PPC-MB-620B)RAID驱动安装(笔记版)
创建RAID后安装系统时看不到磁盘信息,以下案例是安装windows10系统时如何安装主板RAID驱动,由于是笔记版不做过多介绍。 RAID驱动链接:https://advdownload.advantech.com.cn/productfile/Downloadfile1/1-2MAHDQD/AIMB-788_788E_RAID_AHCI_…...
深度分页优化思路
深度分页优化思路 思考以下问题 查询以下SQL的流程是怎么样的呢? 为什么只查询10条数据需要7秒? # 查询时间7秒 SELECT * FROM user ORDER BY age LIMIT 1000000, 10问题分析 为什么分页查询随着翻页的深入,会变得越来越慢。 其实࿰…...
K8S学习之基础五十四:jenkins新建测试流水线
jenkins新建测试流水线 新建任务 node(testak) {stage(第1步:从gitee上下载源代码) {git url: "https://gitee.com/akang007/jenkins-sample"script {build_tag sh(returnStdout: true, script: git rev-parse --short HEAD).trim()}}stage(第2步:基…...
HarmonyOS NEXT(九) :图形渲染体系
HarmonyOS NEXT(九) :图形渲染体系 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,可以分享一下给大家。点击跳转到网站。 https://www.captainbed.cn/ccc 文章目录 HarmonyOS NEXT࿰…...
SQLAlchemy关键词搜索技术深度解析:从基础过滤到全文检索
在数据驱动的应用开发中,基于关键词的模糊查询是常见的业务需求。SQLAlchemy作为Python生态中最流行的ORM框架,提供了多种实现关键词搜索的技术方案。本文将从性能、适用场景和技术复杂度三个维度,系统对比分析SQLAlchemy中关键词搜索的最佳实…...
ES数据过多,索引拆分
公司企微聊天数据存储在 ES 中,虽然按照企业分储在不同的ES 索引中,但某些常用的企微主体使用量还是很大。4年中一个索引存储数据已经达到46多亿条数据,占用存储3.1tb, ES 配置 由于多一个副本,存储得翻倍,成本考虑…...
Rust 与 FFmpeg 实现视频水印添加:技术解析与应用实践
引言 在短视频、直播、影视制作等领域,视频水印是一种常见的工具,用于保护版权、提升品牌辨识度或满足合规性要求。然而,开发者在实现水印添加时往往面临以下挑战: 手动处理效率低:使用图像编辑软件(如 P…...
Python语言的游戏物理
Python语言的游戏物理 引言 在现代游戏开发中,物理引擎是一个重要的组成部分,通过模拟真实世界的物理现象,增加了游戏的沉浸感和可玩性。Python作为一种高效、易用的编程语言,虽然在性能方面不如C等语言,但其灵活性和…...
