0

我正在尝试分配一个变量来读取目录,但出现此错误:

“不能在 viper.AddConfigPath 的参数中使用 &home(*[]fs.FileInfo 类型的值)作为字符串值”

我也尝试了里面的指针,viper.AddConfigPath(&home)但也无济于事

这是代码片段:

// 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)

我正在寻找将其type *[]fs.FileInfo转换为字符串以便viper.AddConfigPath()可以读取它。

更新

我现在已经尝试过这种方式,编译时没有错误,但由于运行时错误,我还不能真正测试代码:

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)
4

3 回答 3

0

你的错误是你有类型不匹配:home是类型[]fs.FileInfo参考)而viper.AddConfigPath()需要一个string参考)。

于 2021-12-29T12:39:54.013 回答
0

1.您可以将错误消息阅读为:

cannot use &home因为value of type *[]fs.FileInfo被插入而不是as string value...

这意味着viper.AddConfigPath需要一个类型的变量,string而不是指向fs.FileInfo.

2.在这里快速搜索列出了另一个可能有相同问题的主题,并且可能是对您问题的提示。

于 2021-12-29T12:41:00.627 回答
-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("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
}


出去:

[key1]

您可以通过路径加载配置:

    if err := readConfig(v, "app.yml"); err != nil {
        log.Fatal(err)
    }
于 2021-12-29T15:11:51.750 回答