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

1、例子1

1.1、yaml文件内容如下:

host: localhost:3306
user: root
pwd: 123456
dbname: test  

1.2、代码如下:

//将yaml文件,转换成对象,再转换成json格式输出
package main

import (
    "encoding/json"
    "fmt"
    "gopkg.in/yaml.v2"
    "io/ioutil"
)

//定义conf类型
//类型里的属性,全是配置文件里的属性
type conf struct {
    Host   string `yaml: "host"`
    User   string `yaml:"user"`
    Pwd    string `yaml:"pwd"`
    Dbname string `yaml:"dbname"`
}

func main() {
    var c conf
    //读取yaml配置文件
    conf := c.getConf()
    fmt.Println(conf)

    //将对象,转换成json格式
    data, err := json.Marshal(conf)

    if err != nil {
        fmt.Println("err:\t", err.Error())
        return
    }

    //最终以json格式,输出
    fmt.Println("data:\t", string(data))
}

//读取Yaml配置文件,
//并转换成conf对象
func (c *conf) getConf() *conf {
    //应该是 绝对地址
    yamlFile, err := ioutil.ReadFile("E:\\Program\\go2\\goPath\\src\\xingej-go\\xingej-go\\xingej-go666\\lib\\yaml\\conf.yaml")
    if err != nil {
        fmt.Println(err.Error())
    }

    err = yaml.Unmarshal(yamlFile, c)

    if err != nil {
        fmt.Println(err.Error())
    }

    return c
}

如果某一个包,本地没有的话,可以在cmd中使用下面的命令,进行下载,如:
go get gopkg.in/yaml.v2

==基本格式:== go get 包的路径

2、例子2,该配置文件中,存在map,slice类型,稍微复杂些

2.1、 配置文件内容:

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"

2.2、 代码如下:

package main

import (
    "encoding/json"
    "fmt"
    "gopkg.in/yaml.v2"
    "io/ioutil"
)

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配置文件,
//并转换成conf对象  struct结构
func (kafkaCluster *KafkaCluster) getConf() *KafkaCluster {
    //应该是 绝对地址
    yamlFile, err := ioutil.ReadFile("E:\\Program\\go2\\goPath\\src\\xingej-go\\xingej-go\\xingej-go666\\lib\\yaml\\sparkConfig.yaml")
    if err != nil {
        fmt.Println(err.Error())
    }

    //err = yaml.Unmarshal(yamlFile, kafkaCluster)
    err = yaml.UnmarshalStrict(yamlFile, kafkaCluster)

    if err != nil {
        fmt.Println(err.Error())
    }

    return kafkaCluster
}

2.3、运行结果:

data:    {"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"}}]}}

==注意:==

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

3 例子3,读取yaml配置文件中的某一个属性

3.1、 配置文件的内容:

apiVersion: v1
Kind: KafkaCluster

3.2、代码如下:

//测试读取yaml文件的
package main

import (
    "fmt"
    "github.com/kylelemons/go-gypsy/yaml"
)

func main() {
    file, err := yaml.ReadFile("E:\\Program\\go2\\goPath\\src\\xingej-go\\xingej-go\\xingej-go666\\lib\\yaml\\nginx")

    if err != nil {
        panic(err.Error())
    }

    apiVersion, error := file.Get("apiVersion")
    if error != nil {
        panic(error.Error())
    }

    fmt.Println("=apiVersion===:\t", apiVersion)

}

3.3、运行结果 :

=apiVersion===:  v1 

4. 说明

例子3中用到的yaml解析包跟前面两个例子不是同一个。  

"gopkg.in/yaml.v2"
"github.com/kylelemons/go-gypsy/yaml"  

例子1,例子2 是整体读取Yaml配置文件,转换成其他格式  

例子3,是读取yaml配置里的某一个属性,  

因此,两者的使用场景是不一样的

原文地址:http://blog.51cto.com/xingej/2115258

时间: 2024-11-08 07:05:31

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

网络采集软件核心技术剖析系列(4)---使用C#语言如何将html网页转换成pdf(html2pdf)

一 本系列随笔概览及产生的背景 本系列开篇受到大家的热烈欢迎,这对博主是莫大的鼓励,此为本系列第四篇,希望大家继续支持,为我继续写作提供动力. 自己开发的豆约翰博客备份专家软件工具问世3年多以来,深受广大博客写作和阅读爱好者的喜爱.同时也不乏一些技术爱好者咨询我,这个软件里面各种实用的功能是如何实现的. 该软件使用.NET技术开发,为回馈社区,现将该软件中用到的核心技术,开辟一个专栏,写一个系列文章,以飨广大技术爱好者. 本系列文章除了讲解网络采编发用到的各种重要技术之外,也提供了不少问题的解决

记一则 Lambda内递归调用方法将集合对象转换成树形结构

public dynamic GetDepartments(string labID) { List<int> usedIDs = new List<int>(); //缓存已用过的ID //定义递归算法 Func<object,List<DepartmentItem>, List<DepartmentItem>, dynamic> recursion = (r,d,a) => { List<dynamic> dyData =

python读取yaml配置文件

yaml简介 1.yaml [?j?m?l]: Yet Another Markup Language :另一种标记语言.yaml 是专门用来写配置文件的语言,非常简洁和强大,之前用ini也能写配置文件,看了yaml后,发现这个更直观,更方便,有点类似于json格式 2.yaml基本语法规则: 大小写敏感 使用缩进表示层级关系 缩进时不允许使用Tab键,只允许使用空格. 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可 #表示注释,从这个字符一直到行尾,都会被解析器忽略,这个和python的

hadoop读取Excel文件转换成txt文件

功能说明:从hdfs读取excel文件,经过poi转换成txt文本文件并输出成hdfs文件 一.引入jar包 <!-- https://mvnrepository.com/artifact/org.apache.poi/poi --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.14</v

Python + PyYAML 读取yaml配置文件数据

一.首先我们需要安装 PyYAML 第三方库 直接使用 pip install PyYAML 就可以(这里我之前是装过的,所以提示我PyYAML已经在这个目录下了,是5.1.2版本的) 二.先看一下我的yaml配置文件中数据的格式. 特点: 1.大小写敏感 2.使用缩进表示层级关系 3.缩进的时候使用的是空格,不是tab键(因为在写python脚本的时候可能会习惯用tab键进行缩进,这里的缩进只能使用空格.只要同层级的对齐,空一格或者空两格都是没有关系的) 4.#号表示注释 (这不就是pytho

【C语言】将一个数字字符串转换成这个字符串对应的数字(包括正浮点数、负浮点数)

#include <stdio.h> /* 编写一个函数,将一个数字字符串转换成这个字符串对应的数字(包括正浮点数.负浮点数) 例如:"12.34" 返回12.34 "-123.34" 返回-123.34 函数原型:double my_atof(char *str) {} */ double my_atof(char *str) { double m=0,n=0,x=1; int flag=1; int flag2=0; if(*str=='-') //

List&lt;Object&gt;转换成Map&lt;String,Object&gt;形式

上一篇讲到了将List<Map<String,Object>> 转换为 List<javaBean>,这次反过来: /** * 用于把List<Object>转换成Map<String,Object>形式,便于存入缓存 * @author zhang_bo * @param keyName 主键属性 * @param list 集合 * @return 返回对象 */ private <T> Map<String, T>

PHP读取csv文件转换成JSON并写入新的文件

没什么好说的,直接上代码. <?php function csvJSON() { // data.csv 是你的csv文件 $lines = array_map('str_getcsv', file('data.csv'));; $result = array(); $headers; if (count($lines) > 0) { $headers = $lines[0]; } for($i=1; $i<count($lines); $i++) { $obj = $lines[$i]

笔试题:金额转换,阿拉伯数字的金额转换成中国传统的形式如:(¥1011)-&gt;(一千零一拾一元整)输出

收集这道题目原因是以前做过,但是实现的很麻烦,这次看到别人写的感觉简单易懂. 从一个pdf看到,出处就不贴了 = .= public class RenMingBi { private static final char[] data = new char[] { '零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖' }; private static final char[] units = new char[] { '元', '拾', '佰', '