Go语言导入api包调用Init()无法获取配置属性值的问题
问题原因与解决方案
咱们先拆解下你的问题:配置解析逻辑放在main包里正常,移到api包的Init函数就拿不到值,这大概率是YAML解析的结构匹配问题或者代码声明顺序的小坑。
最可能的原因:YAML缩进不规范
YAML对缩进的要求特别严格——必须用空格(绝对不能用Tab键),而且同一层级的字段缩进长度得完全一致。看你api包里的configData,如果telegram_token和waves_token前面用了Tab,或者缩进的空格数和api:后面的不一致,YAML解析器会直接认为这些字段不属于api的子字段,自然没法映射到ConfigAPI的字段里,结果就是空值。
对比你main包里的代码,你应该是用了规范的空格缩进,所以解析完全正常。
另一个潜在小坑:包级变量声明顺序
虽然Go允许先声明变量再定义类型,但这种写法有时候会导致变量初始化异常。你api包里先声明了var cfg Config,再定义Config和ConfigAPI类型,这可能会让cfg的初始化不符合预期,间接影响后续的解析操作。
针对性解决方案
修正YAML的缩进格式
把configData里的Tab换成空格,确保子字段和api:的缩进一致(比如统一用2个或4个空格):configData = []byte(`api: telegram_token: "telegramtoken" waves_token: "wavestoken"`)调整类型与变量的声明顺序
先定义结构体类型,再声明包级变量,这更符合Go的代码规范,也能避免初始化问题:// 先定义结构体类型 type Config struct { API ConfigAPI `yaml:"api"` } type ConfigAPI struct { TelegramToken string `yaml:"telegram_token"` WavesToken string `yaml:"waves_token"` } // 再声明包级变量 var ( cfg Config configData = []byte(`api: telegram_token: "telegramtoken" waves_token: "wavestoken"`) )优化错误排查体验
把解析错误输出到标准错误流,避免被后续的HTTP服务日志覆盖,方便你快速定位问题:import "os" // 需要额外导入os包 func (c *Config) parse() { err := yaml.Unmarshal(configData, c) if err != nil { fmt.Fprintf(os.Stderr, "配置解析失败:%v\n", err) } }
按照上面的方法调整后,再调用api.Init()应该就能正常获取到配置值了。
内容的提问来源于stack exchange,提问作者Dmitry S.
相关产品推荐
相关产品推荐

