我一直在尝试通过 viper 读取配置,但它总是出现恐慌 nil 指针引用(我已经设置了配置路径和配置名称)。
然后我尝试在它上面创建一个执行点,它告诉我:
不可读:由于只有部分内容,无法读取 0x8 处的字符串 ReadProcessMemory 或 WriteProcessMemory 请求已完成。
这里是配置目录:配置目录
这就是我设置路径的方式:在此处输入图像描述
我快要疯了!!!困扰我2天了 (请原谅我缺乏 golang 的经验......我是一个新学习者,非常非常感谢您的帮助!)
我尝试了以下结构:
|main.go
|Config
| config.go
| config.yaml
文件 config.go 中包含以下行:
viper.AddConfigPath(".")
viper.SetConfigName("config") // Register config file name (no extension)
viper.SetConfigType("yaml") // Look for specific type
viper.ReadInConfig()
version := viper.Get("server.version")
fmt.Println(version)
我的配置文件包含:
server:
version: 1.0.0
在这种情况下,我的版本为零。 但是,如果我设置了
v.AddConfigPath("./Config")
viper.AddConfigPath("./Config")
viper.SetConfigName("config") // Register config file name (no extension)
viper.SetConfigType("yaml") // Look for specific type
viper.ReadInConfig()
version := viper.Get("server.version")
fmt.Println(version)
那么我的版本是1.0.0。
你的道路取决于你的
main.go
在哪里,而不是你的config.go
在哪里。
如果仍然存在问题,也可能是由于文件权限不当造成的。您仍然可以尝试执行
chmod 777 [your configuration file]
来检查您的代码是否不需要更多权限来读取文件。
看起来我们也有同样的问题,对于我的某些项目,有时有效,有时无效,对于我的某些项目,我调用根应用程序中的函数
配置/config.go
func InitConfig() {
viper.SetConfigName("config")
viper.SetConfigType("yaml")
viper.AddConfigPath(".")
err := viper.ReadInConfig()
if err != nil {
panic(fmt.Errorf("fatal error config file: %w", err))
}
replacer := strings.NewReplacer(".", "_")
viper.SetEnvKeyReplacer(replacer)
viper.AutomaticEnv()
}
cmd/root.go(或者在你的 main.go 中调用它)
func initConfig(){
config.InitConfig()
}
func Execute(){
initConfig()
if err := rootCmd.Execute(); err != nil {
log.Fatal(err)
}
}