我正在使用这个名为Viper的配置库

在我的身体里,我有这样的 idea :

viper.SetConfigName("development")
viper.AddConfigPath("config/settings/")
err := viper.ReadInConfig()
if err != nil {
    fmt.Println("viper config read error %v", err)
}

然后,我有一个以毒蛇为参数的 struct :

type MyConfig struct {
  v *viper.Viper
}

在我的Main中,我有一个函数返回此MyConfig,如下所示:

func NewMyConfig(v *viper.Viper) *MyConfig {
    return &MyConfig{v: v}
}

我得到了这个错误:

./main.go:55: use of package viper without selector

不确定我该做什么?

推荐答案

当你收到一个包裹

import "github.com/spf13/viper"

包名(在本例中为viper)将作为新的标识符提供给您.您可以使用此标识符来构造qualified identifiers以引用包的exported identifiers(以大写字母开头的标识符).

包名称本身不能单独使用.出现错误的行:

myConfig = NewMyConfig(&viper)

您使用了包名viper,但没有指定要从包中引用哪个导出的标识符.

您希望使用NewMyConfig()函数来获取指向MyConfig struct 的新值的指针.您的NewMyConfig()函数需要值*viper.Viper.因为viper.Viper struct 包含未导出的字段,所以您可以像创建&viper.Viper{}那样创建它,但是viper包导出一个函数viper.New(),该函数可用于获取指向新的初始化的viper.Viper值的指针.您可以像这样使用它:

vp := viper.New()
myConfig = NewMyConfig(vp)

请注意,viper包声明了一个内部的、全局的、未报告的viper.Viper"实例".有许多出口的functionsviper.Viper型的methods相匹配.这些"匹配"函数在全局的、未报告的viper.Viper实例上工作.因此,您可以 Select 使用viper包的所有导出全局函数,或者创建自己的Viper实例,然后继续使用其方法.

Go相关问答推荐

带有条件的for循环中缺少RETURN语句

如何在gofr发起的服务间调用请求中添加Authorization Header?

使用Go使用Gorm使用外键对数据进行排序

Docker Compose Health Check未退出,错误为无法启动

无法使用exec从管道中读取.Go中的命令

为什么 `go mod` 占用了另一个磁盘上的空间而不是我的 GOPATH?

Prometheus 摘要分位数错误

为什么 mux.Vars() 返回空的 map[]

杜松子wine 和中间件

git ls-remote 成功而 go get 失败

错误!在为 age-viewer-go 运行 wails dev 或 wails build 命令时

Get 请求在 Thunder 客户端/Postman 中返回数据,但在 Golang 代码中给出空白数据

不能在 *gorm.db 而不是 gorm.db 上使用 WithContext(ctx) 方法

如何在 helm 中将字符串连接到 .AsConfig 的结果?

使用 package`regexp` 查找 Golang 中的所有 mactch 子字符串,但得到意外结果

如何使用特定的 Go 版本运行 govulncheck?

如何在没有内存分配的情况下压缩和发布文件

如何在gorm中处理多个查询

将 Simple Go Web 应用程序部署到 Elastic Beanstalk

如何使用 context.WithCancel 启动和停止每个会话的心跳?