【问题标题】:Getting a use of package without selector error在没有选择器错误的情况下使用包
【发布时间】:2016-05-03 11:44:00
【问题描述】:

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

我主要有这个:

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

然后我有一个以毒蛇为参数的结构:

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

不确定我应该做什么?

【问题讨论】:

  • 您的main.go55 行中有什么内容?
  • 这有帮助吗? github.com/golang/go/issues/7133如果使用包标识符而不指定包中的项目,则返回的错误是“use of package foo not in selector”(play.golang.org/p/Q-KDAvp9mN)
  • @icza 第 55 行是 myConfig = NewMyConfig(&viper)
  • @Blankman &viper => viper 是包的名称。你可能想要myConfig = NewMyConfig(viper.New())。或者,如果您将变量命名为 viper,请更改它。
  • @Blankman viper 是您可以用来引用包的标识符。 v 是包的未导出变量,你不能引用它。您可以使用包名称来引用包的导出标识符,例如viper.New() 调用导出的 New() 函数,该函数返回一个指向新的、初始化的 viper.Viper 结构的指针。

标签: go


【解决方案1】:

当你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(),该函数可用于获取指向新的、初始化的viper.Viper 值的指针。你可以像这样使用它:

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

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

【讨论】:

  • 那是一张饱得消化的嘴:P
猜你喜欢
  • 1970-01-01
  • 2014-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多