在没有选择器错误的情况下使用包

时间:2016-05-03 02:06:09

标签: go

我正在使用名为Viper

的配置库

在我的主要内容中我有这个:

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

然后我有一个结构,以v蛇作为参数:

type MyConfig struct {
  v *viper.Viper
}

在我的主要内容中,我有一个返回此MyConfig的函数,如:

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

我收到此错误:

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

不确定我该做什么?

1 个答案:

答案 0 :(得分:24)

当您import包裹

import "github.com/spf13/viper"

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

包名本身不能单独使用。给你错误的那一行:

myConfig = NewMyConfig(&viper)

您使用了包名viper,但未指定要从包中引用的导出标识符。

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

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

请注意,viper包声明了一个内部的,全局的,未导出的viper.Viper“实例”。有许多导出的函数viper.Viper类型的方法匹配。这些“匹配”函数适用于全局的,未导出的viper.Viper实例。因此,您可以选择使用viper包的所有导出的全局函数,或者创建自己的Viper实例,然后继续使用其方法。