You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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逻辑集中在这里,让内部包通过引用根包的方式获取配置:

  1. 根目录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)
}
  1. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 10:15:14