当前位置: 首页 > news >正文

golang的fs除了定权限还能干什么?

golang的fs除了定权限还能干什么?

golang 中文件 | Golang 中文学习文档详细学习文档!

搞懂fs包的核心 ——fs.FS接口

fs.FS(接口):这是一个“文件系统”的抽象。它只有一个方法Open(name string)

typeFSinterface{// 打开一个文件,返回 fs.File 接口(又是一个规则)Open(namestring)(File,error)}

只要某个类型实现了Open()方法,返回fs.File接口,它就是一个 “合法的fs”,能被fs包的所有工具函数操作。

读取磁盘上的文件(传统方式)os.ReadFile
package main import ( "fmt" "os" ) func main() { // 直接操作硬盘 data, _ := os.ReadFile("config.txt") fmt.Println(string(data)) }
fs模块(现代方式,更灵活)

现在我们把硬盘路径包装成一个fs.FS对象。这样你的函数以后可以接收任何来源的文件。

package main import ( "fmt" "io/fs" "os" ) // 这个函数不关心文件在哪,它只认 fs.FS 接口 func readMyConfig(fsys fs.FS) { data, err := fs.ReadFile(fsys, "config.txt") if err != nil { fmt.Println("读取失败:", err) return } fmt.Println("配置内容:", string(data)) } func main() { // 1. 将当前目录 (.) 包装成一个文件系统对象 dirFS := os.DirFS(".") // 2. 传给通用函数 readMyConfig(dirFS) }

fs包常用的工具函数

fs包提供了一批 “通用工具函数”,和io包的工具函数类似,都是基于fs.FS接口实现的:

函数作用通俗理解
fs.ReadFile(fsys, name)读取文件全部内容等同于io.ReadAll,但针对fs.FS
fs.WalkDir(fsys, root, fn)遍历目录下所有文件 / 子目录通用版的 “遍历目录”
fs.Stat(fsys, name)获取文件信息(大小、是否是目录)等同于os.Stat,但针对fs.FS
fs.Glob(fsys, pattern)按通配符匹配文件(如*.txt找符合规则的文件
示例:用fs.WalkDir遍历目录
packagemainimport("fmt""io/fs""os")funcmain(){// 1. 把本地目录转成 fs.FSlocalFS:=os.DirFS(".")// 2. 遍历当前目录下所有文件/目录err:=fs.WalkDir(localFS,".",func(pathstring,d fs.DirEntry,errerror)error{iferr!=nil{returnerr}// d.IsDir():判断是不是目录(通用规则)fmt.Printf("路径:%s | 是目录:%t\n",path,d.IsDir())returnnil})iferr!=nil{fmt.Println("遍历失败:",err)}}

fs模块真正的威力:go:embed

这是fs最常用的场景。

package main import ( "embed" "fmt" "io/fs" ) var embededFiles embed.FS func main() { // 即使你把编译好的程序拷到没有 hello.txt 的机器上,它也能运行 // 因为文件已经“嵌入”在程序里了 content, _ := fs.ReadFile(embededFiles, "hello.txt") fmt.Println(string(content)) }
  • 可以把静态文件(如图片、SQL、配置)直接编译进你的二进制程序里,然后像操作文件一样操作它们。
packagemainimport("embed""fmt""io/fs")// 关键:用 //go:embed 指令把 static 目录下的所有文件嵌入程序//go:embed static/*varembeddedFS embed.FS// embed.FS 实现了 fs.FS 接口funcmain(){// 用 fs 包的通用函数读取嵌入的文件data,err:=fs.ReadFile(embeddedFS,"static/index.html")iferr!=nil{fmt.Println("读取嵌入文件失败:",err)return}fmt.Println("嵌入的 index.html 内容:",string(data))}
  • 把前端静态文件(HTML/CSS/JS)嵌入到 Go 程序里,打包后只有一个二进制文件,部署超方便。

一句话区分os/io/fs

  • os:操作本地文件的具体实现;
  • io:定义读写数据的通用接口;
  • fs:定义操作文件系统的通用接口。
http://www.jsqmd.com/news/457737/

相关文章:

  • 复试准备day8
  • 解锁系统级操作:5大场景掌握权限管理精髓
  • 如何真正掌控微信数据?WeChatMsg的非典型应用指南
  • 计算机毕业设计java基于Vue.js的工资管理系统的设计与实现 基于SpringBoot的智慧游乐园综合运营管理平台设计 游乐园项目预约与排队叫号一体化管理系统的研发
  • Ansible解锁便捷运维新方式,内网 NAS 也能远程管
  • AI大模型数据治理架构搭建(非常详细):从顶层设计到落地实践,从入门到精通,收藏这一篇就够了!
  • 从此告别拖延,AI论文平台 千笔ai写作 VS 笔捷Ai,本科生专属利器!
  • 汇编代码注入器源码
  • 每天了解几个MCP SERVER:Apify
  • Python打包成可执行文件的方式
  • XGP存档提取器:跨平台游戏进度迁移解决方案
  • 2026冲刺用!实力封神的AI论文工具 —— 千笔·专业学术智能体
  • 0575-步进电机控制(通电+步数+方向)-系统设计(51+数码管+ULN2003)
  • MySQL学习日记——DAY08(流程控制、游标、窗口函数)
  • 别再让一个Agent干所有活!Multi-Agent系统才是企业级应用的未来
  • 广佛莞深RPA定制,数谷智能科技让软件操控自动化?
  • ComfyUI-WanVideoWrapper:AI视频生成工具全攻略
  • 高职计算机专业不再吃香?2026年真实就业岗位全景与逆袭攻略
  • 如何永久保存社交媒体内容?专业级备份工具全解析
  • 改进深度可分离卷积的YOLOv5:面向农业害虫识别的轻量化设计与实现
  • 【脉宽调制DCDC功率变换001】PWM DCDC变换器的特性和问题
  • vgmstream全解析:游戏音频处理从入门到精通
  • 虚拟机安装redia
  • 代码随想录 Day3
  • 3个维度解析微信聊天记录数据管理:从备份到深度分析的完整方案
  • Flutter 组件 mek_data_class_generator 的鸿蒙化适配实战 - 驾驭核心数据防腐大厂,实现 OpenHarmony 业务模型的不可变性与零污染自动化生成
  • 实测对比后AI论文平台,千笔AI VS 万方智搜AI,本科生写作首选!
  • 突破系统权限限制:NSudo权限管理工具全方位应用指南
  • 2026年铝棒品牌新势力:这些铝圆棒品牌正引领市场潮流,包装铝板/平铝板/T3紫铜棒/花纹铝管,铝棒产品排行榜 - 品牌推荐师
  • 华为OD机考双机位C卷 - 挑选宝石 (Java Python JS GO C++ C)