这篇文章主要讲解了“golang怎么通过viper读取config.yaml文件”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“golang怎么通过viper读取config.yaml文件”吧!
1.导入依赖包
import ( "github.com/spf13/viper")
2.编写yaml文件
放在conf
目录下,文件名叫config.yaml
# TODO 本地调试时放开KubeSphere_URL: http://192.168.103.48:3188# TODO 部署到环境时放开#KubeSphere_URL: http://ks-apiserver.kubesphere-system.svc:80KubesphereAdminUser: adminKubespherePassword: Admin123#TODO 调用梅姐服务的ip,暂用当前,后续需要修改Other_service_IP: http://192.168.103.48:30412#Other_service_IP: http://container-cloud-system-controller-manager-metrics-service.container-cloud-system-system.svc:8093Other_service_URL: /capis/quota.ictnj.io/v1alpha1/namespaces/#TODO harbor镜像仓库地址HARBOR_URL: https://192.168.66.4:443HARBOR_ADMIN_USERNAME: adminHARBOR_ADMIN_PASSWD: Harbor12345HARBOR_IP_HTTPS: 192.168.66.4:443HARBOR_SSH_ADDRESS: 192.168.103.48:53304HARBOR_SSH_USERNAME: rootHARBOR_SSH_PASSWD: peng123.
3.编写读取yaml文件的go文件
放在config目录下,文件名叫config.go
需要注意的是目录的问题,如果放在同目录,直接用configurationPath
,不同的编辑器,
vscode跟golang对相对路径处理不同
package configimport ( "github.com/spf13/viper")const ( configurationName = "config" configurationPath = "./conf" // vscode特殊读取路径 // configurationPath_vscode = "../conf" )var Config *viper.Viperfunc init() { Config = viper.New() Config.SetConfigName(configurationName) Config.AddConfigPath(configurationPath) Config.SetConfigType("yaml") Config.AddConfigPath(configurationPath) if err := config.ReadInConfig(); err != nil { panic(err) } }
如果config.yaml
跟config.go放在同目录简单的路径用上面这个,如果路径不同,且不同的同事用不同的编译软件,可以尝试下面的路径兼容
package configimport ( "github.com/spf13/viper")const ( configurationName = "config" configurationPath = "./conf" // vscode特殊读取路径 configurationPath_vscode = "../conf" )var Config *viper.Viperfunc init() { Config = viper.New() Config.SetConfigName(configurationName) Config.AddConfigPath(configurationPath) Config.SetConfigType("yaml") if err := Config.ReadInConfig(); err != nil { Config.AddConfigPath(configurationPath_vscode) if err := Config.ReadInConfig(); err != nil { Config.AddConfigPath(configurationPath) panic(err) } }}
4.使用config对象
Config.GetString("KubeSphere_URL")
5.viper源码分析
type Viper struct { // Delimiter that separates a list of keys // used to access a nested value in one go keyDelim string // A set of paths to look for the config file in configPaths []string // The filesystem to read config from. fs afero.Fs // A set of remote providers to search for the configuration remoteProviders []*defaultRemoteProvider // Name of file to look for inside the path configName string configFile string configType string configPermissions os.FileMode envPrefix string automaticEnvApplied bool envKeyReplacer StringReplacer allowEmptyEnv bool config map[string]interface{} override map[string]interface{} defaults map[string]interface{} kvstore map[string]interface{} pflags map[string]FlagValue env map[string]string aliases map[string]string typeByDefValue bool // Store read properties on the object so that we can write back in order with comments. // This will only be used if the configuration read is a properties file. properties *properties.Properties onConfigChange func(fsnotify.Event)}
func (v *Viper) ReadInConfig() error { jww.INFO.Println("Attempting to read in config file") filename, err := v.getConfigFile() if err != nil { return err } if !stringInSlice(v.getConfigType(), SupportedExts) { return UnsupportedConfigError(v.getConfigType()) } jww.DEBUG.Println("Reading file: ", filename) file, err := afero.ReadFile(v.fs, filename) if err != nil { return err } config := make(map[string]interface{}) err = v.unmarshalReader(bytes.NewReader(file), config) if err != nil { return err } v.config = config return nil}
把yaml文件的键值读取到viper对象的config当中
感谢各位的阅读,以上就是“golang怎么通过viper读取config.yaml文件”的内容了,经过本文的学习后,相信大家对golang怎么通过viper读取config.yaml文件这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!