英文:
Variable for a directory but get error when calling it
问题
我正在尝试为一个变量分配一个读取目录的值,但是我遇到了这个错误:
"无法将 &home(类型为 *[]fs.FileInfo)作为字符串值用于 viper.AddConfigPath 的参数"
我还尝试了在 viper.AddConfigPath(&home)
中使用指针,但也没有成功。
以下是代码片段:
// 查找主目录
home, err := ioutil.ReadDir("../db-dump")
cobra.CheckErr(err)
// 在主目录中搜索名为 ".config"(无扩展名)的配置文件
viper.AddConfigPath(home)
我希望将 type *[]fs.FileInfo
转换为字符串,以便 viper.AddConfigPath()
可以读取它。
更新
我现在尝试了以下方式,编译时没有错误,但由于运行时错误,我无法真正测试代码:
home := "工作目录"
fileSystem := os.DirFS(home)
fs.WalkDir(fileSystem, ".", func(path string, d fs.DirEntry, err error) error {
if err != nil {
log.Fatal(err)
}
fmt.Println(path)
return nil
})
// 在主目录中搜索名为 ".config"(无扩展名)的配置文件
viper.AddConfigPath(home)
英文:
I'm trying to assign a variable to read a directory but I get this error:
> "cannot use &home (value of type *[]fs.FileInfo) as string value in argument to viper.AddConfigPath"
I also tried the pointer inside viper.AddConfigPath(&home)
but to no avail as well
Here is a snippet of the code:
// Find home directory
home, err := ioutil.ReadDir("../db-dump")
cobra.CheckErr(err)
// Search config in home directory with name ".config" (without extension)
viper.AddConfigPath(home)
I'm looking to transform the type *[]fs.FileInfo
into a string so viper.AddConfigPath()
can read it.
Update
I've tried now this way and I'm getting no error compiling, but I can't really test the code yet because of runtime errors:
home := "working directory"
fileSystem := os.DirFS(home)
fs.WalkDir(fileSystem, ".", func(path string, d fs.DirEntry, err error) error {
if err != nil {
log.Fatal(err)
}
fmt.Println(path)
return nil
})
// Search config in home directory with name ".config" (without extension)
viper.AddConfigPath(home)
答案1
得分: 1
你的错误是类型不匹配:home
是类型为 []fs.FileInfo
(参考链接),而 viper.AddConfigPath()
需要一个 string
类型的参数(参考链接)。
英文:
Your mistake is that you have type mismatch: home
is of type []fs.FileInfo
(reference) while viper.AddConfigPath()
expects a string
(reference).
答案2
得分: 1
- 你可以将错误消息解读为:
无法使用 &home
,因为插入的是 *[]fs.FileInfo
类型的值,而不是 string
类型的值...
这意味着 viper.AddConfigPath
需要一个 string
类型的变量,而不是一个指向 fs.FileInfo
数组的指针。
- 在这里进行了快速搜索,列出了另一个主题,可能有相同的问题,并可能提供了对你的问题的提示。
英文:
1. You can read the error message as:
cannot use &home
because value of type *[]fs.FileInfo
is inserted instead of as string value
...
Meaning that viper.AddConfigPath
requires a variable of type string
and not a pointer to an array of fs.FileInfo
.
2. A quick search here listed this another topic that may have the same issue and probably a tip to your question.
答案3
得分: -1
首先创建一个新的配置文件(仅用于测试代码):
echo "key1: value" > AppName.yaml
然后运行以下代码:
package main
import (
"errors"
"fmt"
"log"
"github.com/spf13/viper"
)
func main() {
v := viper.GetViper()
if err := readConfig(v, ""); err != nil {
log.Fatal(err)
}
fmt.Println(v.AllKeys())
}
func readConfig(v *viper.Viper, configPath string) error {
var err error
if configPath != "" {
v.SetConfigFile(configPath)
if err := v.ReadInConfig(); err != nil {
return fmt.Errorf("无法读取应用程序配置=%q:%w", configPath, err)
}
return nil
}
// 在当前目录中查找 .<AppName>.yaml
v.AddConfigPath(".")
v.SetConfigName("AppName")
if err = v.ReadInConfig(); err == nil {
return nil
} else if !errors.As(err, &viper.ConfigFileNotFoundError{}) {
return fmt.Errorf("无法解析配置=%q:%w", v.ConfigFileUsed(), err)
}
return nil
}
输出结果为:
[key1]
你可以通过路径加载配置:
if err := readConfig(v, "app.yml"); err != nil {
log.Fatal(err)
}
英文:
first create new config file (just for test code):
echo "key1: value" > AppName.yaml
and run the code
package main
import (
"errors"
"fmt"
"log"
"github.com/spf13/viper"
)
func main() {
v := viper.GetViper()
if err := readConfig(v, ""); err != nil {
log.Fatal(err)
}
fmt.Println(v.AllKeys())
}
func readConfig(v *viper.Viper, configPath string) error {
var err error
if configPath != "" {
v.SetConfigFile(configPath)
if err := v.ReadInConfig(); err != nil {
return fmt.Errorf("unable to read application config=%q : %w", configPath, err)
}
return nil
}
// look for .<AppName>.yaml (in the current directory)
v.AddConfigPath(".")
v.SetConfigName("AppName")
if err = v.ReadInConfig(); err == nil {
return nil
} else if !errors.As(err, &viper.ConfigFileNotFoundError{}) {
return fmt.Errorf("unable to parse config=%q: %w", v.ConfigFileUsed(), err)
}
return nil
}
out:
[key1]
You can load config by path:
if err := readConfig(v, "app.yml"); err != nil {
log.Fatal(err)
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论