2016-05-03 11 views
13

Tôi đang sử dụng thư viện cấu hình này được gọi là ViperBắt một sử dụng gói mà không có lỗi selector

Trong chính của tôi, tôi có điều này:

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

sau đó tôi có một cấu trúc mà phải mất một viper như tham số:

type MyConfig struct { 
    v *viper.Viper 
} 

Trong chính của tôi, tôi có một hàm trả về MyConfig này như:

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

Tôi nhận được lỗi này:

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

Không chắc những gì tôi nên làm gì?

+1

Và có gì trong 'main.go' của bạn tại dòng' 55'? – icza

+0

Điều này có hữu ích không? https://github.com/golang/go/issues/7133 Nếu người dùng sử dụng mã định danh gói mà không chỉ định một mục trong gói, lỗi được trả về là "sử dụng gói foo không có trong bộ chọn" (http: // play .golang.org/p/Q-KDAvp9mN) – Ankush

+1

@icza dòng 55 là '' 'myConfig = NewMyConfig (& viper)' '' – Blankman

Trả lời

16

Khi bạn import một gói như

import "github.com/spf13/viper" 

tên gói (đó là viper trong trường hợp này) sẽ có sẵn cho bạn như là một định danh mới. Bạn có thể sử dụng số nhận dạng này để xây dựng qualified identifiers để tham chiếu đến exported identifiers của gói (số nhận dạng bắt đầu bằng chữ cái viết hoa).

Bản thân tên gói không thể tự sử dụng được. Dòng cung cấp cho bạn báo lỗi:

myConfig = NewMyConfig(&viper) 

Bạn sử dụng tên gói viper mà không chỉ định những gì xuất khẩu nhận dạng bạn muốn tham khảo từ các gói.

Bạn muốn sử dụng hàm NewMyConfig() để có được con trỏ đến giá trị mới của cấu trúc MyConfig. Hàm NewMyConfig() của bạn mong đợi một giá trị là *viper.Viper. Vì cấu trúc viper.Viper chứa các trường chưa được xuất hiện, bạn chỉ có thể tạo trường như &viper.Viper{}, nhưng gói viper xuất hàm viper.New() có thể được sử dụng để lấy con trỏ đến giá trị mới, được khởi tạo viper.Viper. Bạn có thể sử dụng nó như:

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

Lưu ý rằng gói viper tuyên bố một nội bộ, toàn cầu, unexported viper.Viper "dụ". Có nhiều hàm được xuất khớp với phương pháp của loại viper.Viper. Các hàm "phù hợp" này hoạt động trên trường hợp viper.Viper toàn cầu, chưa được xuất bản. Vì vậy, bạn có thể chọn sử dụng tất cả các chức năng toàn cầu đã xuất của gói viper hoặc tạo cá thể Viper của riêng bạn và sau đó tiếp tục sử dụng các phương thức của nó sau đó.

Các vấn đề liên quan