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://www.bubuko.com/infodetail-2596503.html