Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Getting a use of package without selector error

Tags:

go

I'm using this config library called Viper

In my main I have this:

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

I then have a struct that takes a viper as parameter:

type MyConfig struct {
  v *viper.Viper
}

In my main I have a function that returns this MyConfig like:

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

I am getting this error:

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

Not sure what I should be doing?

like image 488
Blankman Avatar asked May 03 '16 02:05

Blankman


1 Answers

When you import a package like

import "github.com/spf13/viper"

the package name (which is viper in this case) will be available to you as a new identifier. You may use this identifier to construct qualified identifiers to refer to exported identifiers of the package (identifiers that start wtih an uppercase letter).

The package name itself cannot be used by itself. The line that gives you error:

myConfig = NewMyConfig(&viper)

You used package name viper without specifying what exported identifier you want to refer to from the package.

You want to use your NewMyConfig() function to obtain a pointer to a new value of your MyConfig struct. Your NewMyConfig() function expects a value of *viper.Viper. Since the viper.Viper struct contains unexported fields, you can just create it like &viper.Viper{}, but the viper package exports a function viper.New() which can be used to obtain a pointer to a new, initialized viper.Viper value. You may use it like:

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

Note that the viper package declares an internal, global, unexported viper.Viper "instance". There are many exported functions that match methods of the viper.Viper type. These "matching" functions work on the global, unexported viper.Viper instance. So you may choose to use all the exported global functions of the viper package, or create your own Viper instance and then keep using its methods afterwards.

like image 101
icza Avatar answered Oct 21 '22 21:10

icza