Go语言学习之viper读取yaml配置文件并转成struct

Go语言学习之viper读取yaml配置文件并转成struct

  • 前言
  • 实现过程
    • 安装Viper组件
    • 编写配置文件
    • 编写Go方法
  • 总结
  • 参考链接

前言

  • 背景介绍

    在项目中,通常一些信息不能硬编码到代码中,例如数据库链接、账号信息等。因此需要将这些数据写到配置文件中,在项目中读取,从而满足通过修改配置文件而实现轻量迭代的需求。

  • 技术选型

    Go项目中通常使用toml格式文件作为配置文件,但由于之前一直从事Java开发,默认初始化配置文件格式为yaml

    解析yaml格式配置文件的方式一般有yaml.v2和Viper两种,本文以Viper作为技术选型。

实现过程

安装Viper组件

  • 执行命令

    
        # Go1.17版本
        go install github.com/spf13/viper@latest
    
    
    
    

编写配置文件

  • yaml配置

    
        apiVersion: v1
        kind: KafkaCluster2
        metadata:
          name: kafka-operator
          labels:
            config1:
              address: kafka-operator-labels-01
              id: kafka-operator-labels-02
              name: mysql-example-cluster-master
              nodeName: 172.16.91.21
              role: master
            config2:
               address: kafka-operator-labels-01
               id: kafka-operator-labels-02
               name: mysql-example-cluster-slave
               nodeName: 172.16.91.110
               role: slave
        spec:
          replicas: 1
          name: kafka-controller
          image: 172.16.26.4:5000/nginx
          ports: 8088
          conditions:
            - containerPort: 8080
              requests:
                cpu: "0.25"
                memory: "512Mi"
              limits:
                cpu: "0.25"
                memory: "1Gi"
            - containerPort: 9090
              requests:
                cpu: "0.33"
                memory: "333Mi"
              limits:
                cpu: "0.55"
                memory: "5Gi"
    
    

编写Go方法

  • 创建入口函数

    
    
        package main
    
        import (
            "encoding/json"
            "fmt"
            "github.com/spf13/viper"
            _ "gopkg.in/yaml.v2"
            "os"
        )
    
        type KafkaCluster struct {
           
            ApiVersion string   `yaml:"apiVersion"`
            Kind       string   `yaml: "kind"`
            Metadata   Metadata `yaml: "metadata"`
            Spec       Spec     `yaml: "spec"`
        }
    
        type Metadata struct {
           
            Name string `yaml:"name"`
            //map类型
            Labels map[string]*NodeServer `yaml:"labels"`
        }
    
        type NodeServer struct {
           
            Address string `yaml: "address"`
            Id      string `yaml: "id"`
            Name    string `yaml: "name"`
            //注意,属性里,如果有大写的话,tag里不能存在空格
            //如yaml: "nodeName" 格式是错误的,中间多了一个空格,不能识别的
            NodeName string `yaml:"nodeName"`
            Role     string `yaml: "role"`
        }
    
        type Spec struct {
           
            Replicas int    `yaml: "replicas"`
            Name     string `yaml: "name"`
            Image    string `yaml: "iamge"`
            Ports    int    `yaml: "ports"`
            //slice类型
            Conditions []Conditions `yaml: "conditions"`
        }
    
        type Conditions struct {
           
            ContainerPort string   `yaml:"containerPort"`
            Requests      Requests `yaml: "requests"`
            Limits        Limits   `yaml: "limits"`
        }
    
        type Requests struct {
           
            CPU    string `yaml: "cpu"`
            MEMORY string `yaml: "memory"`
        }
    
        type Limits struct {
           
            CPU    string `yaml: "cpu"`
            MEMORY string `yaml: "memory"`
        }
    
        // 主程序入口
        func main() {
           
            var c KafkaCluster
            //读取yaml配置文件, 将yaml配置文件,转换struct类型
            conf := c.getConf()
    
            //将对象,转换成json格式
            data, err := json.Marshal(conf)
    
            if err != nil {
           
                fmt.Println("err:\t", err.Error())
                return
            }
    
            //最终以json格式,输出
            fmt.Println("data:\t", string(data))
        }
    
    
        //读取Yaml配置文件,并转换成KafkaCluster对象  struct结构
        func (kafkaCluster *KafkaCluster) getConf() *KafkaCluster {
           
    
            //获取项目的执行路径
            path, err := os.Getwd()
            if err != nil {
           
                panic(err)
            }
    
            vip := viper.New()
            vip.AddConfigPath(path + "/config")  //设置读取的文件路径
            vip.SetConfigName("application") //设置读取的文件名
            vip.SetConfigType("yaml") //设置文件的类型
            //尝试进行配置读取
            if err := vip.ReadInConfig(); err != nil {
           
                panic(err)
            }
    
            err = vip.Unmarshal(&kafkaCluster)
            if err != nil {
           
                panic(err)
            }
    
            return kafkaCluster
        }
    
    
    
    

总结

  • 注意事项

    yaml配置文件里,如果属性里存在大写的话,定义对应的属性时,一定不能有空格,可以参考上面例子中NodeServer里的说明

参考链接

  • Go语言之读取yaml配置文件,转换成struct结构,json形式输出

    https://blog.51cto.com/xingej/2115258

  • Golang使用第三方包viper读取yaml配置信息操作

    http://www.zzvips.com/article/144547.html

  • Go实战(一)–读取Yaml格式的配置文件

    https://studygolang.com/articles/33188?fr=sidebar

你可能感兴趣的:(Go,golang,后端)