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

golang讀取yaml配置文件的方法實(shí)現(xiàn)

 更新時間:2024年10月25日 09:45:26   作者:code:404-not-found  
本文主要介紹了golang讀取yaml配置文件的方法實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

Viper

Viper是適用于Go應(yīng)用程序的完整配置解決方案。它被設(shè)計用于在應(yīng)用程序中工作,并且可以處理所有類型的配置需求和格式。它支持以下特性:

  • 設(shè)置默認(rèn)值
  • 從JSON、TOML、YAML、HCL、envfile和Java properties 格式的配置文件讀取配置信息
  • 實(shí)時監(jiān)控和重新讀取配置文件(可選)
  • 從環(huán)境變量中讀取
  • 從遠(yuǎn)程配置系統(tǒng)(etcd或Consul)讀取并監(jiān)控配置變化
  • 從命令行參數(shù)讀取配置
  • 從buffer讀取配置
  • 顯式配置值

安裝

go get github.com/spf13/viper

使用

在項(xiàng)目根目錄創(chuàng)建config文件夾,在文件夾中創(chuàng)建local.yaml

servername: 'myserver'

mysql:
  name: 'mysql'

在main.go中讀取配置文件的信息

package main

import (
	"log"

	"github.com/spf13/viper"
)

func main() {
	v := viper.New()

	// 設(shè)置文件名稱
	v.SetConfigFile("./config/local.yaml")

	if err := v.ReadInConfig(); err != nil {
		log.Panicln("讀取配置文件失敗")
	}

	servername := v.Get("servername")
	mysql := v.Get("mysql.name")
	log.Println(servername, mysql)
}

使用結(jié)構(gòu)體映射yaml

修改配置文件

name: '服務(wù)名'
port: 8080

使用

package main

import (
	"log"

	"github.com/spf13/viper"
)

type ServerConfig struct {
	Name string `mapstructure:"name"`
	Port int    `mapstructure:"port"`
}

func main() {

	cfg := ServerConfig{}
	v := viper.New()

	// 設(shè)置文件名稱
	v.SetConfigFile("./config/local.yaml")

	if err := v.ReadInConfig(); err != nil {
		log.Panicln("讀取配置文件失敗")
	}

	if err := v.Unmarshal(&cfg); err != nil {
		log.Panicln(err)
	}

	log.Println(cfg)
}

輸出

{服務(wù)名 8080}

結(jié)構(gòu)體嵌套讀取配置

配置文件

name: '服務(wù)名'
port: 8080
mysql: 
  host: '127.0.0.1'
  port: 3306

讀取配置

package main

import (
	"log"

	"github.com/spf13/viper"
)

type ServerConfig struct {
	Name        string      `mapstructure:"name"`
	Port        int         `mapstructure:"port"`
	MysqlConfig MysqlConfig `mapstructure:"mysql"` // 嵌套的配置
}

type MysqlConfig struct {
	Host string `mapstructure:"host"`
	Port int    `mapstructure:"port"`
}

func main() {

	cfg := ServerConfig{}
	v := viper.New()

	// 設(shè)置文件名稱
	v.SetConfigFile("./config/local.yaml")

	if err := v.ReadInConfig(); err != nil {
		log.Panicln("讀取配置文件失敗")
	}

	if err := v.Unmarshal(&cfg); err != nil {
		log.Panicln(err)
	}

	log.Println(cfg)
}

輸出

{服務(wù)名 8080 {127.0.0.1 3306}}

根據(jù)不同環(huán)境讀取不同配置文件

在實(shí)際開發(fā)工作中,一般有不同的開發(fā)環(huán)境,會涉及到讀取不同的配置文件

這會運(yùn)用的golang的flag包

package main

import (
	"flag"
	"log"
)


func main() {

	env := flag.String("env", "local", "運(yùn)行環(huán)境請輸入local dev test prod")
	flag.Parse()

	log.Println("當(dāng)前環(huán)境是" + *env)

}

運(yùn)行

go run .\main.go -help

輸出

-env string
運(yùn)行環(huán)境請輸入local dev test prod (default "local")

這樣的話運(yùn)行

go run .\main.go -env dev

輸出

當(dāng)前環(huán)境是dev

利用flag讀取不同環(huán)境的配置文件

在項(xiàng)目更目錄新建config文件夾

并創(chuàng)建4個配置文件 local.yaml dev.yaml test.yaml prod.yaml

其中dev.yaml中

name: 'dev服務(wù)名'
port: 8080
mysql: 
  host: '127.0.0.1'
  port: 3306

在main.go中

package main

import (
	"flag"
	"fmt"
	"log"

	"github.com/spf13/viper"
)

type ServerConfig struct {
	Name        string      `mapstructure:"name"`
	Port        int         `mapstructure:"port"`
	MysqlConfig MysqlConfig `mapstructure:"mysql"` // 嵌套的配置
}

type MysqlConfig struct {
	Host string `mapstructure:"host"`
	Port int    `mapstructure:"port"`
}

func main() {

	env := flag.String("env", "local", "運(yùn)行環(huán)境請輸入local dev test prod")
	flag.Parse()

	log.Println("當(dāng)前環(huán)境是" + *env)

	cfg := ServerConfig{}
	v := viper.New()
	var path string = fmt.Sprintf("./config/%s.yaml", *env)
	// 設(shè)置文件名稱
	v.SetConfigFile(path)

	if err := v.ReadInConfig(); err != nil {
		log.Panicln("讀取配置文件失敗")
	}

	if err := v.Unmarshal(&cfg); err != nil {
		log.Panicln(err)
	}

	log.Println(cfg)
}

運(yùn)行

go run .\main.go -env dev

輸出

當(dāng)前環(huán)境是dev
{dev服務(wù)名 8080 {127.0.0.1 3306}}

到此這篇關(guān)于golang讀取yaml配置文件的方法實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)golang讀取yaml內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • golang監(jiān)聽文件變化的實(shí)例

    golang監(jiān)聽文件變化的實(shí)例

    這篇文章主要介紹了golang監(jiān)聽文件變化的實(shí)例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • golang如何用type-switch判斷interface變量的實(shí)際存儲類型

    golang如何用type-switch判斷interface變量的實(shí)際存儲類型

    這篇文章主要介紹了golang如何用type-switch判斷interface變量的實(shí)際存儲類型,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-04-04
  • goland 設(shè)置project gopath的操作

    goland 設(shè)置project gopath的操作

    這篇文章主要介紹了goland 設(shè)置project gopath的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-05-05
  • 利用ChatGPT編寫一個Golang圖像壓縮函數(shù)

    利用ChatGPT編寫一個Golang圖像壓縮函數(shù)

    這篇文章主要為大家詳細(xì)介紹了如何利用ChatGPT幫我們寫了一個Golang圖像壓縮函數(shù),文中的示例代碼簡潔易懂,感興趣的小伙伴可以嘗試一下
    2023-04-04
  • Go1.21新增maps包的用法詳解

    Go1.21新增maps包的用法詳解

    maps?包提供了幾個非常有用的用于操作?map?類型(任何類型的?map)的函數(shù),本文為大家整理了部分函數(shù)的具體用法,感興趣的小伙伴可以了解一下
    2023-08-08
  • GO中的條件變量sync.Cond詳解

    GO中的條件變量sync.Cond詳解

    條件變量是基于互斥鎖的,它必須基于互斥鎖才能發(fā)揮作用,條件變量的初始化離不開互斥鎖,并且它的方法有點(diǎn)也是基于互斥鎖的,這篇文章主要介紹了GO的條件變量sync.Cond,需要的朋友可以參考下
    2023-01-01
  • 一文帶你輕松理解Go中的內(nèi)存逃逸問題

    一文帶你輕松理解Go中的內(nèi)存逃逸問題

    這篇文章主要給大家介紹Go中的內(nèi)存逃逸問題,文中通過代碼示例講解的非常詳細(xì),對我們的學(xué)習(xí)或工作有一定的參考價值,感興趣的同學(xué)可以跟著小編一起來學(xué)習(xí)
    2023-06-06
  • Go 語言結(jié)構(gòu)實(shí)例分析

    Go 語言結(jié)構(gòu)實(shí)例分析

    在本篇文章里小編給大家整理的是一篇關(guān)于Go 語言結(jié)構(gòu)實(shí)例分析的相關(guān)知識點(diǎn),有興趣的朋友們可以學(xué)習(xí)下。
    2021-07-07
  • go語言制作分頁器實(shí)例探究

    go語言制作分頁器實(shí)例探究

    這篇文章主要為大家介紹了go語言制作分頁器實(shí)例探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01
  • golang中byte和rune用法及新手易錯點(diǎn)總結(jié)

    golang中byte和rune用法及新手易錯點(diǎn)總結(jié)

    golang內(nèi)置類型有rune類型和byte類型,下面這篇文章主要給大家介紹了關(guān)于golang中byte和rune用法及新手易錯點(diǎn)總結(jié)的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-03-03

最新評論