golang解析yaml文件操作
首先安裝解析的第三方包:
go get gopkg.in/yaml.v2
示例:
package main
import (
"os"
"log"
"fmt"
"encoding/json"
"gopkg.in/yaml.v2"
)
type Config struct {
Test Test `yaml:"test"`
}
type Test struct {
User []string `yaml:"user"`
MQTT MQ `yaml:"mqtt"`
Http HTTP `yaml:"http"`
}
type HTTP struct {
Port string `yaml:"port"`
Host string `yaml:"host"`
}
type MQ struct {
Host string `yaml:"host"`
Username string `yaml:"username"`
Password string `yaml:"password"`
}
//read yaml config
//注:path為yaml或yml文件的路徑
func ReadYamlConfig(path string) (*Config,error){
conf := &Config{}
if f, err := os.Open(path); err != nil {
return nil,err
} else {
yaml.NewDecoder(f).Decode(conf)
}
return conf,nil
}
//test yaml
func main() {
conf,err := ReadYamlConfig("D:/test_yaml/test.yaml")
if err != nil {
log.Fatal(err)
}
byts,err := json.Marshal(conf)
if err != nil {
log.Fatal(err)
}
fmt.Println(string(byts))
}
test.yaml內(nèi)容如下:
test:
user:
- Tom
- Lily
- Skay
mqtt:
host: localhost:1883
username: test
password: test
http: {port: "8080", host: "127.0.0.1"}
運(yùn)行結(jié)果:
{"Test":{"User":["Tom","Lily","Skay"],"MQTT":{"Host":"localhost:1883","Username":"test","Password":"test"},"Http":{"Port":"8080","Host":"127.0.0.1"}}}
補(bǔ)充:golang 讀取yml格式,多結(jié)構(gòu)體級聯(lián)
1.安裝yml解析包
進(jìn)入到gopath下執(zhí)行命令
go get gopkg.in/yaml.v2
源碼地址https://github.com/go-yaml/yaml
2.設(shè)置配置文件config.yml
ipport: 192.168.2.95:10000 startsendtime: 2017-01-02 08:08:08 sendmaxcountperday: 100 devices: - devid: 123456789 nodes: - pkid: 0 bkid: 0 index: 0 minvalue: 0 maxvalue: 60 datatype: normal - pkid: 0 bkid: 0 index: 0 datatype: boolean - devid: 10001 nodes: - pkid: 0 bkid: 1 index: 0 datatype: boolean warnfrequency: 10 sendfrequency: 10
3.編寫測試類
package main
import (
"fmt"
"gopkg.in/yaml.v2"
"io/ioutil"
)
//配置文件中字母要小寫,結(jié)構(gòu)體屬性首字母要大寫
type Myconf struct {
Ipport string
StartSendTime string
SendMaxCountPerDay int
Devices []Device
WarnFrequency int
SendFrequency int
}
type Device struct {
DevId string
Nodes []Node
}
type Node struct {
PkId string
BkId string
Index string
MinValue float32
MaxValue float32
DataType string
}
func main() {
data, _ := ioutil.ReadFile("config.yml")
fmt.Println(string(data))
t := Myconf{}
//把yaml形式的字符串解析成struct類型
yaml.Unmarshal(data, &t)
fmt.Println("初始數(shù)據(jù)", t)
if(t.Ipport==""){
fmt.Println("配置文件設(shè)置錯誤")
return;
}
d, _ := yaml.Marshal(&t)
fmt.Println("看看 :", string(d))
}
4.注意
1.配置文件中字母要小寫,結(jié)構(gòu)體屬性首字母要大寫,開發(fā)比較快
也可以指定如:yaml:"c",只不過有點(diǎn)麻煩,當(dāng)然如果重命名必須要指定
2.yaml:",flow"
這個意思是將數(shù)組用[“a”,”b”]這樣的格式展示,默認(rèn)展示形式是
- a
- b
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。
相關(guān)文章
Golang信號處理及如何實(shí)現(xiàn)進(jìn)程的優(yōu)雅退出詳解
這篇文章主要給大家介紹了關(guān)于Golang信號處理及如何實(shí)現(xiàn)進(jìn)程的優(yōu)雅退出的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2018-03-03
Golang?Mutex錯過會后悔的重要知識點(diǎn)分享
互斥鎖?Mutex?是并發(fā)控制的一個基本手段,是為了避免并發(fā)競爭建立的并發(fā)控制機(jī)制,本文主要為大家整理了一些Mutex的相關(guān)知識點(diǎn),希望對大家有所幫助2023-07-07
Golang使用ReverseProxy實(shí)現(xiàn)反向代理的方法
本文介紹了如何使用Golang的ReverseProxy實(shí)現(xiàn)反向代理,包括源碼結(jié)構(gòu)解析和官方單機(jī)示例NewSingleHostReverseProxy,同時指出,若要實(shí)現(xiàn)負(fù)載均衡,需要自行開發(fā),還提供了一個簡單的HTTP服務(wù)用于測試,感興趣的朋友跟隨小編一起看看吧2024-09-09
Go語言標(biāo)準(zhǔn)庫flag的具體實(shí)現(xiàn)
Go語言的flag庫提供了一套簡單而強(qiáng)大的接口,用于解析命令行參數(shù),本文主要介紹了Go語言標(biāo)準(zhǔn)庫flag的具體實(shí)現(xiàn),具有一定的參考價值,感興趣的可以了解一下2024-03-03
Golang中基于HTTP協(xié)議的網(wǎng)絡(luò)服務(wù)
HTTP協(xié)議是基于TCP/IP協(xié)議棧的,并且它也是一個面向普通文本的協(xié)議。這篇文章主要詳細(xì)介紹了Golang中基于HTTP協(xié)議的網(wǎng)絡(luò)服務(wù),感興趣的小伙伴可以借鑒一下2023-04-04

