欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Golang解析yaml文件的方法小結

 更新時間:2024年11月01日 09:19:11   作者:心恩惠動  
Go 語言沒有內置解析 yaml 文件的功能,實現 yaml 的解析可以使用第三方庫,下面我們就來看看如何使用opkg.in/yaml.v2 和 gopkg.in/yaml.v3實現解析yaml吧

yaml 文件是目前最常用的配置文件,使用go語言編寫代碼和工具時,也會用到y(tǒng)aml文件,將服務配置及中間件等信息定義到y(tǒng)aml文件中,后續(xù)可根據實際場景來選用。

//先下載外部包
go get -u gopkg.in/yaml.v2

1、定義yaml配置文件

conf/test.yaml

ck:
  host: 11.11.11.11
  port: 9001
  database: db2
  username: test2
  password: 123ck456
user: test
password: 123yy456
host: 10.10.10.10
port: 3306
dbname: db1

2、主程序

package main

import (
    "database/sql"
    "fmt"
    "gopkg.in/yaml.v3"
    "io/ioutil"
    "time"
)

type Conn struct {
    Ck struct {
        Host     string `yaml:"host"`
        Port     string `yaml:"port"`
        Database string `yaml:"database"`
        Username string `yaml:"username"`
        Password string `yaml:"password"`
    }
}
type Mysql struct {
    User     string `yaml:"user"`
    Password string `yaml:"password"`
    Host     string `yaml:"host"`
    Port     string `yaml:"port"`
    DBname   string `yaml:"dbname"`
}

const cfgFile = "conf/test.yaml"

func main() {
    data, err := ioutil.ReadFile(cfgFile)  //讀取配置文件的路徑
    if err != nil {
        fmt.Printf("err: %v\n", err)
        return
    }

    var conf Conn
    if err := yaml.Unmarshal(data, &conf); err != nil {  //將yaml文件中的信息反序列化給conf結構體
        fmt.Printf("err: %v\n", err)
        return
    }
    yml, _ := yaml.Marshal(conf)  //序列化為yaml文件
    fmt.Printf("conf: %#v\n", conf)
    fmt.Printf("%s\n", yml)

    var confs Mysql
    if err := yaml.Unmarshal(data, &confs); err != nil {
        fmt.Printf("err: %v\n", err)
        return
    }
    yaml, _ := yaml.Marshal(confs)
    fmt.Printf("conf: %#v\n", confs)
    fmt.Printf("%s\n", yaml)

    //連接數據庫
    user := confs.User
    password := confs.Password
    host := confs.Host
    port := confs.Port
    database := confs.DBname
    dataSourceName := user + ":" + password + "@tcp(" + host + ":" + port + ")/" + database + "?charset=utf8&parseTime=True"
    conn, err := sql.Open("mysql", dataSourceName)
    if err != nil {
        return
    }
    conn.SetConnMaxLifetime(time.Minute * 30)     //最大連接超時時間,應小于數據庫本身的鏈接超時時間
    conn.SetMaxIdleConns(10)                  //最大閑置連接數(并發(fā)時可以同時獲取的連接,也是用完后放回池里面的互用的連接, 從而提升性能)
    conn.SetMaxOpenConns(100)                 //最大打開連接數,0為不限制

    //記得結束后關閉連接
    defer conn.Close()
}

3、輸出結果

conf: main.Conn{Ck:struct { Host string "yaml:\"host\""; Port string "yaml:\"por
t\""; Database string "yaml:\"database\""; Username string "yaml:\"username\"";
Password string "yaml:\"password\"" }{Host:"11.11.11.11", Port:"9001", Database:
"db2", Username:"test2", Password:"123ck456"}}
ck:
    host: 11.11.11.11
    port: "9001"
    database: db2
    username: test2
    password: 123ck456

conf: main.Mysql{User:"test", Password:"123yy456", Host:"10.10.10.10", Port:"330
6", DBname:"db1"}
user: test
password: 123yy456
host: 10.10.10.10
port: "3306"
dbname: db1

4、補充

4.1 已棄用 'ReadFile'

從 Go 語言 1.16 開始,ioutil.ReadAll、ioutil.ReadFile 和 ioutil.ReadDir 被棄用,因為 io/ioutil 包被棄用。

解決方法如下,使用 io 或 os 包中相同的方法替換,即修改自己按如下參照修改包名即可

ioutil.ReadAll -> io.ReadAll
    ioutil.ReadFile -> os.ReadFile
    ioutil.ReadDir -> os.ReadDir
    // others
    ioutil.NopCloser -> io.NopCloser
    ioutil.ReadDir -> os.ReadDir
    ioutil.TempDir -> os.MkdirTemp
    ioutil.TempFile -> os.CreateTemp
    ioutil.WriteFile -> os.WriteFile

 4.2 yaml文件里的變量命名規(guī)則

yaml文件里的變量需全用小寫字母。使用大寫字母、中劃線、下劃線等,如 CK: 127.1.1.1 mySQL : xxx Myql : xxx my_sql : xxx 會在解讀yaml配置文件時出問題,解讀出來是空值,且不會報錯

到此這篇關于Golang解析yaml文件的方法小結的文章就介紹到這了,更多相關Go解析yaml內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家

相關文章

  • 為什么GO不支持循環(huán)引用

    為什么GO不支持循環(huán)引用

    這篇文章主要介紹的是為什么GO不支持循環(huán)引用,學習 Go 語言的開發(fā)者越來越多了,很多小伙伴在使用時,就會遇到種種不理解的問題,其中一點就是包的循環(huán)引用的報錯,下main文章我們一起來看看學習原因
    2021-10-10
  • Go關鍵字defer的使用和底層實現

    Go關鍵字defer的使用和底層實現

    defer是Go語言的關鍵字,一般用于資源的釋放和異常的捕捉,defer語句后將其后面跟隨的語句進行延遲處理,就是說在函數執(zhí)行完畢后再執(zhí)行調用,也就是return的ret指令之前,本文給大家介紹了Go關鍵字defer的使用和底層實現,需要的朋友可以參考下
    2023-11-11
  • Go語言實現釘釘發(fā)送通知

    Go語言實現釘釘發(fā)送通知

    本文通過代碼給大家介紹了Go語言實現釘釘發(fā)送通知,代碼簡單易懂,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-11-11
  • Golang如何實現任意進制轉換的方法示例

    Golang如何實現任意進制轉換的方法示例

    進制轉換是人們利用符號來計數的方法,進制轉換由一組數碼符號和兩個基本因素“基數”與“位權”構成,這篇文章主要給大家介紹了關于Golang如何實現10進制轉換62進制的方法,文中給出了詳細的示例代碼供大家參考學習學習,下面隨著小編來一起學習學習吧。
    2017-09-09
  • Go下載安裝及切換不同版本的實現方法

    Go下載安裝及切換不同版本的實現方法

    本文詳細介紹了如何下載和安裝Go語言,以及如何切換不同版本的Go,通過提供詳細的步驟和解釋,幫助讀者理解Go語言的安裝和版本管理
    2024-12-12
  • Go 面向包新提案透明文件夾必要性分析

    Go 面向包新提案透明文件夾必要性分析

    這篇文章主要為大家介紹了Go 面向包新提案,透明文件夾必要性分析,看看是否合適加進 Go 特性中,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-11-11
  • Go語言select語句用法示例

    Go語言select語句用法示例

    這篇文章主要為大家介紹了Go語言select語句用法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08
  • Golang使用gin框架實現一個完整的聊天室功能

    Golang使用gin框架實現一個完整的聊天室功能

    由于我們項目的需要,我就研究了一下關于websocket的相關內容,去實現一個聊天室的功能,經過幾天的探索,現在使用Gin框架實現了一個完整的聊天室+消息實時通知系統(tǒng),感興趣的小伙伴歡迎閱讀本文
    2023-08-08
  • GoRoutines高性能同時進行多個Api調用實現

    GoRoutines高性能同時進行多個Api調用實現

    這篇文章主要為大家介紹了GoRoutines高性能同時進行多個Api調用實現示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03
  • Golang中的int類型和uint類型到底有多大?

    Golang中的int類型和uint類型到底有多大?

    int和uint類型在我們日常開發(fā)中經常會用到,但有個疑問就是這兩個類型有多大,通過各種嘗試最終得到了答案,所以下面這篇文章主要給大家介紹了關于Golang中的int類型和uint類型到底有多大的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下。
    2017-12-12

最新評論