开发者

Golang实现yaml配置文件的解析

目录
  • 代码
    • 需要建立3个文件,目录结构如下:
    • 配置文件 conf.yaml
    • 主程序 readyaml.go
  • 首先,需要整理和更新项目的依赖关系
    • 第二步,直接执行脚本: go run readyaml.go ;

      代码

      需要建立3个文件,目录结构如下:

      Golang实现yaml配置文件的解析

      配置文件 conf.yaml

      Redis:  
        host: "127.0.0.1"
        port: 6379
        db: 11  
        pass: "aaaaaa" 

      go模块文件 go.mod,用于管理项目的依赖关系和版本信息。

      module readyaml

      主程序 readyaml.go

      pacjavascriptkage main
       
      import (
          "github.com/spf13/viper"
          "fmt"
      )
       
      // 配置文件
      type Conf struct {
          Redis RedisConfig      `mapstructure:"redis"`
      }
       
      // redis配置数据
      type RedisConfig struct{
          HOST    string    `mapstructure:"host"`
          PORT    int       `mapstructure:"port"`
          DB      int       `mapstructure:"db"`
          PASS    string    `mapstructure:"pass"`
      }
       
      func getConf() Conf{
          var cfg Conf 
       
          // 设置待读取配置文件的名字
          viper.SetConfigName("conf")
          // 设置待读取配置文件的格式
          viper.SetConfigType("yaml")
          // 添加配置文件的检索路径
          viper.AddConfigPath(".")
       
          // 读取数据
          if err := viper.ReadInConfig(); err != nil {
              fmt.Printf("ReadInConfig error : %s\n", err)
              return cfg
          }
       
          // 测试 1 : 直接获取数据
          fmt.Printf("Host %s\n", viper.GetString("redis.host"))
          fmt.Printf("PORT %d\n", viper.GetInt("redis.port"))
          fmt.Printf("DB %d\n", viper.GetInt("redis.db"))
      php    fmt.Printf("PASS %s\n", viper.GetString("redis.pass"))
       
          // 通过viper模块,反序列化成对象
          if err := viper.Unmarshal(&cfg);http://www.devze.com err != nil {
              fmt.Printf("Unmarshal error : %s\n", err)
              return cfg
          }
       
          return cfg 
      }
       
      var cfg Conf = getConf()
       
      func main() {
          // 打印测试
          fmt.Printf("HOST %s, PORT %d, DB %d, PASS %s lenandroid(PASS) %d\n", cfg.Redis.HOST, cfg.Redis.PORT, cfg.Redis.DB, cfg.Redis.PASS, len(cfg.Redis.PASS) )
      }

      首先,需要整理和更新项目的依赖关系

      go mod编程 tidy

      这个过程中,会下载缺失的模块。go.mod文件会进行更新,并且多出一个go.sum文件,用于记录项目依赖树中所有模块的特定版本内容的预期哈希值。

      Golang实现yaml配置文件的解析

      在这个过程中,如果无法联网,或者无法访问源,则会报错如下图。如果没有报错,则可以直接执行第二步。

      Golang实现yaml配置文件的解析

      可以使用国内go代理解决这个问题,此处用到GOPROXY环境变量。

      执行 export GOPROXY=https://goproxy.cn,然后继续执行 go mod tidy

      也可以在 /etc/bashrc或者~/.bashrc文件添加这个命令,这样每次登录会话会自动添加此环境变量。

      第二步,直接执行脚本: go run readyaml.go ;

      也可以编译后再执行二进制文件: go build readyaml.go,编译后,创建了编译后的文件 readyaml。

      直接执行 ./readyaml。具体操作,如下图所示:

      Golang实现yaml配置文件的解析

      避坑:定义的数据结构成员变量必须是大写字母开头,不然 viper.Unmarshal 这一步可能映射不成功。这是由于在golang中,以小写字母开头定义的标识符(如变量名、函数名、类型名等)只能在本包内访问,是不能跨包访问的。

      也就是:type RedisConfig struct 和 type Conf struct 的成员变量需要大写开头。

      以上就是Golang实现yaml配置文件的解析的详细内容,更多关于Golang解析yaml文件的资料请关注编程客栈(www.devze.com)其它相关文章!

      0

      上一篇:

      下一篇:

      精彩评论

      暂无评论...
      验证码 换一张
      取 消

      最新开发

      开发排行榜