Go Web 编程实战:用 `os` 包完成文件与目录操作(基于 build-web-application-with-golang 第 7.5 节)
文档教程【免费下载链接】build-web-application-with-golangA golang ebook intro how to build a web with golang项目地址https://gitcode.com/gh_mirrors/bu/build-web-application-with-golang点击查看免费下载文件是每一台计算机上的基本对象Web 应用同样离不开文件读写——无论是生成目录、上传文件、写日志还是解析数据。本篇指南以开源电子书《build-web-application-with-golang》Go Web 编程第 7 章「文本处理」的 7.5 节为核心系统讲解 Go 标准库os包中目录与文件操作的全部核心函数Mkdir、MkdirAll、Remove、RemoveAll、Create、Open、OpenFile、Write、WriteAt、WriteString、Read、ReadAt。读完本文你将掌握在 Go Web 应用中创建目录、读写文件、删除文件以及处理文件上传落盘的完整实战能力。本文对应的原始章节为 es/07.5.md西班牙语版与 en/07.5.md英文版属于全书第 7 章 文本处理 的一部分。全文代码基于 Go 标准库os包可在任意 Go 版本中直接运行验证。目录操作创建、递归创建与删除在 Go 中绝大多数文件操作函数都位于标准库os包中。目录相关的核心函数共有四个覆盖了「创建单层目录、递归创建多层目录、删除单层目录、递归删除整棵目录树」四种场景函数签名功能说明func Mkdir(name string, perm FileMode) error创建名称为name的单层目录权限由perm指定例如0777。func MkdirAll(path string, perm FileMode) error根据path递归创建多级子目录例如astaxie/test1/test2中间缺失的层级会一并创建。func Remove(name string) error删除名称为name的目录如果该路径不是目录或目录非空会返回错误。func RemoveAll(path string) error根据path递归删除多级目录及其下所有内容如果path是单个名称则连同该目录下的所有子目录一并删除。原文给出了一个完整的演示程序创建与删除目录的完整流程如下package main import ( fmt os ) func main() { os.Mkdir(astaxie, 0777) os.MkdirAll(astaxie/test1/test2, 0777) err : os.Remove(astaxie) if err ! nil { fmt.Println(err) } os.RemoveAll(astaxie) }这段代码的执行过程值得仔细推敲os.Mkdir(astaxie, 0777)先创建单层目录astaxieos.MkdirAll(astaxie/test1/test2, 0777)在此基础上递归创建test1、test2两级子目录由于此时astaxie目录下已存在子目录并非空目录所以os.Remove(astaxie)会返回错误——这正是程序打印错误信息的原因最后os.RemoveAll(astaxie)递归删除整个目录树错误得以消除。权限参数说明perm的类型是FileMode0777表示文件所有者、所属组和其他用户均拥有读4、写2、执行1权限。Web 应用中创建上传目录、日志目录时通常配合0666文件读写或0755目录读写执行使用。创建与打开文件Create、NewFile、Open 与 OpenFile新建文件有两种方式函数签名功能说明func Create(name string) (file *File, err Error)根据提供的文件名创建新文件返回可读写的文件对象默认权限为0666。func NewFile(fd uintptr, name string) *File根据底层文件描述符file descriptor创建文件对象并返回。打开文件同样有两种方式函数签名功能说明func Open(name string) (file *File, err Error)以只读方式打开名为name的文件其内部实现实际上调用了OpenFile。func OpenFile(name string, flag int, perm uint32) (file *File, err Error)以指定模式打开名为name的文件。flag是打开方式只读、读写等perm是文件权限。OpenFile是最底层的打开函数flag常用取值包括os.O_RDONLY只读os.O_WRONLY只写os.O_RDWR读写os.O_CREATE文件不存在时创建os.O_TRUNC打开时清空文件内容os.O_APPEND以追加方式写入。多个标志可用|按位组合例如os.O_WRONLY|os.O_CREATE|os.O_TRUNC表示「只写、不存在则创建、创建后清空」。源码佐证这种组合方式正是本书 4.5 节文件上传示例 中保存上传文件的实际写法。在该示例的saveUpload函数里接收端拿到multipart.File后用os.OpenFile(localFilename, os.O_WRONLY|os.O_CREATE, 0666)创建本地文件随后用io.Copy(f, file)将上传内容流式写入磁盘。可见flag决定读写意图、perm决定新文件权限二者缺一不可f, err : os.OpenFile(localFilename, os.O_WRONLY|os.O_CREATE, 0666) checkError(err) defer f.Close() _, err io.Copy(f, file) checkError(err)写入文件Write、WriteAt 与 WriteStringos.File对象提供三个写入方法方法签名功能说明func (file *File) Write(b []byte) (n int, err Error)向文件写入byte类型二进制内容返回实际写入的字节数n。func (file *File) WriteAt(b []byte, off int64) (n int, err Error)从文件中指定位置off开始写入byte类型内容。func (file *File) WriteString(s string) (ret int, err Error)向文件写入字符串内容。原文的写入示例演示了WriteString与Write混用的典型写法并借助defer保证文件关闭package main import ( fmt os ) func main() { userFile : astaxie.txt fout, err : os.Create(userFile) if err ! nil { fmt.Println(userFile, err) return } defer fout.Close() for i : 0; i 10; i { fout.WriteString(Just a test!\r\n) fout.Write([]byte(Just a test!\r\n)) } }执行后astaxie.txt中将写入 20 行文本。这段代码有三个实战要点错误必须检查os.Create失败如目录不存在、权限不足时立即打印并return避免后续空指针操作defer fout.Close()务必使用Go 中文件对象需要显式关闭defer保证函数退出时必然释放文件描述符WriteString与Write的本质区别前者接收字符串后者接收[]byte。二者内部最终都落到系统调用write只是入参类型不同[]byte写法在需要写入二进制数据如图片、序列化结果时更通用。读取文件Read 与 ReadAt读取文件对应两个方法方法签名功能说明func (file *File) Read(b []byte) (n int, err Error)从文件当前位置读取数据填充到缓冲区b返回读取字节数。func (file *File) ReadAt(b []byte, off int64) (n int, err Error)从文件中指定位置off开始读取数据到b不改变文件指针位置。原文的读取示例演示了「固定缓冲区 循环读取」的经典模式package main import ( fmt os ) func main() { userFile : asatxie.txt fl, err : os.Open(userFile) if err ! nil { fmt.Println(userFile, err) return } defer fl.Close() buf : make([]byte, 1024) for { n, _ : fl.Read(buf) if 0 n { break } os.Stdout.Write(buf[:n]) } }关键逻辑在于循环体每次调用fl.Read(buf)至多填充 1024 字节返回实际读取字节数n当读到文件末尾时n 0循环终止每次读取到的内容通过os.Stdout.Write(buf[:n])直接输出到标准输出实现整文件内容的逐块打印。注意buf[:n]的切片写法——只写出本次实际读入的部分避免把缓冲区残留内容一并输出。该模式是 Web 应用中流式读取大文件如日志分析、文件下载的通用基础。删除文件RemoveGo 语言中删除文件和删除目录使用同一个函数函数签名功能说明func Remove(name string) error删除名称为name的文件或目录。当name以/结尾时表示删除的是目录若目录非空删除会返回错误。需要递归删除目录树时改用前文介绍过的os.RemoveAll(path string)。与 Web 应用实战的结合文件操作在 Web 编程中高频出现生成日志目录、保存用户上传、缓存静态资源、读取模板文件等。本书 4.5 节的上传示例 完整串联了本节的知识点——os.OpenFile以os.O_WRONLY|os.O_CREATE模式创建落盘文件权限0666配合defer f.Close()与io.Copy完成流式写入。这正是本节「创建文件 → 写入文件 → 关闭文件」三步流程在真实 Web 场景中的直接应用。实践提示仓库 en/code/readme.md 中说明若要独立运行各章节示例代码可将环境变量GOPATH设置为code目录路径以避免工作区路径问题本文所有示例均为独立main包直接go run即可验证。小结本节围绕os包梳理了 Go 文件操作的最小闭环用Mkdir/MkdirAll建目录用Create/Open/OpenFile建文件与打开文件用Write/WriteAt/WriteString写入用Read/ReadAt读取用Remove/RemoveAll清理。配合「检查错误、defer关闭、缓冲区循环读取」三个习惯足以覆盖绝大多数 Web 应用的文件处理需求。延伸阅读本章总览7 文本处理上一节模板处理第 7 章 MVC 视图层与template包下一节字符串处理strings包常用操作全书目录preface.md赞分享文档教程【免费下载链接】build-web-application-with-golangA golang ebook intro how to build a web with golang项目地址https://gitcode.com/gh_mirrors/bu/build-web-application-with-golang点击查看免费下载相关推荐Go Web 文件操作实战精讲深入 os 包掌握目录与文件读写《Build Web Application with Golang》7.5 节Go Web 文件操作实战精讲深入 os 包掌握目录与文件读写《Build Web Application with Golang》7.5 节 文件操作是文档教程Hydra Multi-run 参数扫描实战从 -m 标志到 Sweeper/Launcher 插件体系Hydra Multi run 参数扫描实战从 m 标志到 Sweeper/Launcher 插件体系 导读 多运行Multi run是 Hydra 框架文档教程Go 标准库 XML 编解码实战基于 build-web-application-with-golang 第 7.1 节Go 标准库 XML 编解码实战基于 build web application with golang 第 7.1 节 导读 XML 是 Web 服务中最常文档教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

2026年10月上海名义人擅自转让律师推荐|李超律师团队

2026年10月上海名义人擅自转让律师推荐|李超律师团队

代持的股权被名义股东"悄悄卖掉",实际出资人(或其配偶)能不能追回?一句话结论:名义股东属无权处分,受让人善意与否决定结局——真实出资人能证明代持关系且受让人非善意的,可主张转让…

2026/10/4 7:30:01 阅读更多 →
Codex桌面端汉化实战:i18n资源替换与ASAR解包重打包

Codex桌面端汉化实战:i18n资源替换与ASAR解包重打包

1. 为什么我要给 Codex 桌面端做汉化Codex 桌面端这东西,刚上手的时候确实挺唬人——功能强、界面干净、响应快,但满屏的英文菜单对不少国内开发者来说还是有点膈应。尤其是团队里刚入行的同学,看到 “Settings” 里那一堆 “Advanced Config…

2026/10/4 7:30:01 阅读更多 →
汽车三安一体Agent实践:用智能体生成功能安全、SOTIF与信息安全初稿

汽车三安一体Agent实践:用智能体生成功能安全、SOTIF与信息安全初稿

1. 从“人建模型”到“Agent建初稿”到底在说什么汽车功能安全、预期功能安全(SOTIF)和信息安全,这三块内容在传统整车开发流程里一直是三条相对独立的线。功能安全看的是电子电气系统失效后会不会导致危害,SOTIF盯的是没有系统失…

2026/10/4 7:30:01 阅读更多 →

最新新闻

Nginx应用与运维——Nginx代理服务应用实战(gRPC代理)

Nginx应用与运维——Nginx代理服务应用实战(gRPC代理)

Nginx代理服务应用实战3、gRPC代理3.1、gRPC介绍3.2、gRPC模块指令3.3、gRPC反向代理配置3、gRPC代理 Nginx从1.13.10版本开始就提供了对gRPC代理的支持,其可以通过gRPC模块的反向代理功能对外发布包括基于SSL的gRPC服务,且其应用Nginx提供的HTTPv2模块…

2026/10/4 7:58:19 阅读更多 →
L298N电机驱动模块详解:从H桥原理到Arduino实战与故障排查

L298N电机驱动模块详解:从H桥原理到Arduino实战与故障排查

初次见到那块蓝色的L298N模块时,我的第一反应和大多数做小车项目的人一样:找张接线图,把跳线一插,让电机转起来就行。等真正接线,问题才接踵而至——为什么模块烫得能煎鸡蛋?为什么电机嗡嗡响就是不走&…

2026/10/4 7:58:19 阅读更多 →
MRAM替代Flash和EEPROM:PIC18F55K42与MR25H40CDF工业存储方案

MRAM替代Flash和EEPROM:PIC18F55K42与MR25H40CDF工业存储方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 7:58:19 阅读更多 →
风筝数据集:VOC+YOLO双格式目标检测标注与训练实战

风筝数据集:VOC+YOLO双格式目标检测标注与训练实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 7:58:19 阅读更多 →
Open-Shell完全指南:找回并定制Windows经典开始菜单

Open-Shell完全指南:找回并定制Windows经典开始菜单

如果你跟我一样,从Windows XP、Windows 7一路用过来,前几年升级到Windows 10或者Windows 11之后,最常见的别扭感多半来自那个全新的开始菜单。尤其是Windows 8那阵子,连开始菜单整个都被砍掉了,当时多少人装系统第一件…

2026/10/4 7:58:19 阅读更多 →
floorplan-3d 10 个必会快捷键:户型装修设计效率翻 3 倍(附完整键位清单)

floorplan-3d 10 个必会快捷键:户型装修设计效率翻 3 倍(附完整键位清单)

floorplan-3d 10 个必会快捷键:户型装修设计效率翻 3 倍(附完整键位清单) 【免费下载链接】floorplan-3d 项目地址: https://gitcode.com/gh_mirrors/fl/floorplan-3d 想快速上手 floorplan-3d 户型装修设计工具?这套 10 个…

2026/10/4 7:57:15 阅读更多 →

日新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/2 10:36:31 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/3 9:42:35 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/3 9:42:36 阅读更多 →