栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Go语言

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

Go语言 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/905823.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号