当调用一个目录变量时出现错误。

huangapple go评论96阅读模式
英文:

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

  1. 你可以将错误消息解读为:

无法使用 &home,因为插入的是 *[]fs.FileInfo 类型的值,而不是 string 类型的值...

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

  1. 在这里进行了快速搜索,列出了另一个主题,可能有相同的问题,并可能提供了对你的问题的提示。
英文:

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 &quot;key1: value&quot; &gt; AppName.yaml

and run the code

package main

import (
	&quot;errors&quot;
	&quot;fmt&quot;
	&quot;log&quot;

	&quot;github.com/spf13/viper&quot;
)

func main() {
	v := viper.GetViper()
	if err := readConfig(v, &quot;&quot;); err != nil {
		log.Fatal(err)
	}
	fmt.Println(v.AllKeys())

}

func readConfig(v *viper.Viper, configPath string) error {
	var err error

	if configPath != &quot;&quot; {
		v.SetConfigFile(configPath)
		if err := v.ReadInConfig(); err != nil {
			return fmt.Errorf(&quot;unable to read application config=%q : %w&quot;, configPath, err)
		}
		return nil
	}
	// look for .&lt;AppName&gt;.yaml (in the current directory)
	v.AddConfigPath(&quot;.&quot;)
	v.SetConfigName(&quot;AppName&quot;)
	if err = v.ReadInConfig(); err == nil {
		return nil
	} else if !errors.As(err, &amp;viper.ConfigFileNotFoundError{}) {
		return fmt.Errorf(&quot;unable to parse config=%q: %w&quot;, v.ConfigFileUsed(), err)
	}

	return nil
}


out:

[key1]

You can load config by path:

	if err := readConfig(v, &quot;app.yml&quot;); err != nil {
		log.Fatal(err)
	}

huangapple
  • 本文由 发表于 2021年12月29日 19:34:49
  • 转载请务必保留本文链接:https://go.coder-hub.com/70518849.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定