我正在使用這個名為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不確定我應該做什么?
1 回答

www說
TA貢獻1775條經驗 獲得超8個贊
當你導入一個包時
import "github.com/spf13/viper"
包名稱(viper在這種情況下)將作為新標識符提供給您。您可以使用此標識符來構造限定標識符以引用包的導出標識符(以大寫字母開頭的標識符)。
包名本身不能單獨使用。給你錯誤的行:
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.Viperviper.ViperviperViper
- 1 回答
- 0 關注
- 212 瀏覽
添加回答
舉報
0/150
提交
取消