如何在Go项目中用go:embed读取configs目录下的配置文件
解决Go项目中使用
go:embed读取根目录configs文件的问题 核心原因
go:embed的路径是相对于当前Go文件所在目录的,你在internal/jsonproc下写//go:embed configs/*时,Go会尝试查找internal/jsonproc/configs目录,而非项目根目录的configs,因此加载失败。
推荐解决方案(符合Standard Project Layout)
在项目根目录的configs目录下创建一个专用的配置加载文件,将go:embed逻辑集中在这里,让内部包通过引用根包的方式获取配置:
- 根目录
configs/config_loader.go代码:
package configs import "embed" //go:embed *.json var ConfigFS embed.FS // ReadJSON 辅助函数,读取指定JSON配置文件 func ReadJSON(filename string) ([]byte, error) { return ConfigFS.ReadFile(filename) }
- 在
internal/jsonproc的代码中导入该包(替换为你的项目模块路径):
package jsonproc import "your-module-path/configs" func ProcessConfig() { data, err := configs.ReadJSON("example.json") if err != nil { // 错误处理逻辑 } // 解析JSON并处理... }
这种方式彻底规避了相对路径问题,完全符合Standard Project Layout的模块化设计,内部包只需依赖根目录的配置包即可获取配置内容。
备选方案(直接使用相对路径)
如果不想单独创建配置包,也可以在internal/jsonproc的Go文件中使用正确的相对路径:
package jsonproc import "embed" //go:embed ../../configs/*.json var ConfigFiles embed.FS func ProcessConfig() { // 读取时直接使用文件名,因为embed的基路径已经指向根目录configs data, err := ConfigFiles.ReadFile("example.json") if err != nil { // 错误处理逻辑 } // 解析JSON并处理... }
不过这种方式的相对路径会随着文件位置变动而失效,健壮性不如第一种方案。
注意事项
go:embed要求Go版本1.16及以上- 用于
embed的变量必须是全局变量,不能是函数内的局部变量 - 如果要嵌入整个目录,路径需写成
../../configs/(注意末尾斜杠),这样会包含目录下所有文件及子目录
内容的提问来源于stack exchange,提问作者bitmagic52
相关产品推荐
相关产品推荐

