Go读取yaml文件,struct返回,json输出

程序模块中,缺少不了一些配置定义,这时定义yaml是个很好的选择

先定义yaml文件内容,文件名为:task_status_config.yaml

复制代码
confs:
  #阅读类任务,即提醒任务
  read:
    name: read
    await: #待开始任务
      status_id: 0
    ing: #进行中任务
      receipt: #是否已阅读
        yes:
          status_id: 4 #已完成
        no:
          status_id: 1 #进行中
    timeout: #已逾期
      receipt: #是否已阅读
        yes:
          status_id: 8 #已逾期-已完成
        no:
          status_id: 2 #已逾期-未完成
  #回执类任务,即预警任务
  receipt:
    name: receipt
    await: #待开始任务
      status_id: 0
    ing: #进行中任务
      receipt: #是否已回执
        yes:
          status_id: 4 #已完成
        no:
          status_id: 1 #进行中
    timeout: #已逾期
      receipt: #是否已回执
        yes:
          status_id: 8 #已逾期-已完成
        no:
          status_id: 2 #已逾期-未完成
  #目标类任务,即系统任务
  target:
    name: target
    await: #待开始任务
      status_id: 0
    ing: #进行中任务
      receipt: #是否已回执
        yes:
          status_id: 3 #已回执
        no:
          status_id: 1 #进行中
    timeout: #已逾期
      receipt: #是否已回执
        yes:
          status_id: 7 #已逾期-已回执
        no:
          status_id: 2 #已逾期-未完成
    finish: #已完成任务
      status_id: 4 #已完成

编写程序读取yaml配置文件

Go 复制代码
package main

import (
	"encoding/json"
	"fmt"
	"os"

	"gopkg.in/yaml.v2"
)

type TaskStatusConf struct {
	Confs map[string]*TaskClassify `yaml:"confs" json:"confs"`
}

type TaskClassify struct {
	Name    string        `yaml:"name" json:"name"`
	Await   StatusIdToInt `yaml:"await" json:"await"`
	Ing     TaskRecept    `yaml:"ing" json:"ing"`
	Timeout TaskRecept    `yaml:"timeout" json:"timeout"`
	Finish  StatusIdToInt `yaml:"finish" json:"finish"`
}

type StatusIdToInt struct {
	StatusId int `yaml:"status_id" json:"status_id"`
}

type TaskRecept struct {
	Receipt StatusReceipt `yaml:"receipt" json:"receipt"`
}

type StatusReceipt struct {
	Yes StatusIdToInt `yaml:"yes" json:"yes"`
	No  StatusIdToInt `yaml:"no" json:"no"`
}

func getYaml() {
	var c TaskStatusConf
	//读取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(string):\t", string(data))

	var res TaskStatusConf
	_ = json.Unmarshal(data, &res)
	// 以结构体形式访问
	fmt.Println(res.Confs["read"].Ing.Receipt.No.StatusId)
}

// 读取Yaml配置文件,
// 并转换成conf对象  struct结构
func (taskStatusConf *TaskStatusConf) getConf() *TaskStatusConf {
	//应该是 绝对地址
	yamlFile, err := os.ReadFile("../task_status_config.yaml")
	if err != nil {
		fmt.Println(err.Error())
	}
	//err = yaml.Unmarshal(yamlFile, kafkaCluster)
	err = yaml.UnmarshalStrict(yamlFile, taskStatusConf)
	if err != nil {
		fmt.Println(err.Error())
	}
	return taskStatusConf
}

运行结果:

相关推荐
zh7314几秒前
Go 1.23 → 1.26 升级检查文档
开发语言·chrome·golang
CRMEB系统商城1 分钟前
汽车养护连锁的数字化底座CRMEB 多门店系统实战方案
java·开发语言·小程序·开源·汽车
努力努力再努力wz8 分钟前
【Redis入门系列】:从 RESP 协议到 redis-plus-plus:Redis 客户端编程与 C++ 接口设计
开发语言·数据库·c++·redis·分布式·缓存·架构
后台模板学习1 小时前
Rust vs Python 在用户认证模块中的实现:底层
开发语言·python·rust
所念皆星海9111 小时前
Python学习---DAY10函数
开发语言·python·学习
wuyk5553 小时前
104.C 语言字节对齐:从底层原理到工程实践的完整指南
c语言·开发语言·stm32·单片机·嵌入式硬件
君顾19 小时前
智慧零售实战指南:从技术架构到落地方案全解析
java·开发语言·零售
南棱笑笑生9 小时前
20260904实测给飞凌OK3576-C开发板刷入Rockchip原厂的IMG固件【使用飞凌的DTS】切换串口波特率为1.5Mbps
c语言·开发语言·rockchip
平头哥技术团队10 小时前
Day 10 | 工欲善其事:VS Code 配置与项目归档
android·开发语言·前端·javascript·html·交互
乌萨奇也要立志学C++10 小时前
【洛谷】kmp算法
开发语言·算法