亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Go?viper讀取配置文件的示例詳解

 更新時(shí)間:2023年08月29日 10:01:04   作者:copyLeft  
這篇文章主要為大家詳細(xì)介紹了Go語(yǔ)言如何利用viper實(shí)現(xiàn)讀取配置文件,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的可以參考一下

參考

viper github

API

Viper-Go一站式配置管理工具

安裝

    go get github.com/spf13/viper

簡(jiǎn)單例子

/*
  目錄
    - main.go
    - config.yaml
*/
func main(){
	viper.SetConfigName("config") // 設(shè)置配置名稱
	viper.SetConfigFile("config.yaml") // 設(shè)置配置文件路徑
    // 讀取配置
	if err := viper.ReadInConfig(); err != nil{
		log.Fatal(err)
	}
    // 獲取配置數(shù)據(jù)
	summary := viper.GetString("Summary")
	fmt.Println(summary)
}

新建 Viper

viper 提供默認(rèn) Viper對(duì)象, 可直接使用。 也通過(guò) New 方法創(chuàng)建自定義Viper

// 直接使用默認(rèn)對(duì)象
viper.GetInt("count")
// 獲取全局Viper對(duì)象
globalViper := viper.GetViper()
// 新建Viper
conf := viper.New()
conf.SetConfigFile("config.yaml")

讀取配置文件

從配置讀取

 viper.SetConfigName("config")
 viper.SetConfigFile("config.yaml")
 if err := viper.ReadInConfig(); err != nil{
     log.Fatal(err)
 }
 version := viper.GetString("version")

從 io.Reader 讀取

func main(){
    file, err := os.Open("./config.yaml")
    if err != nil{
        log.Fatal(err)
    }
    defer file.Close()
    viper.SetConfig("yaml")
    version := viper.GetString("version")
    // 這里需要設(shè)置配置類型, 否則無(wú)法正確解釋配置內(nèi)容
    // 如果未配置類型,也可以通過(guò) Get 方法獲取數(shù)據(jù)自行解析。
}

從 flag 讀取

import (
	"fmt"
	"github.com/spf13/pflag"
	"github.com/spf13/viper"
)
func main() {
	pflag.String("ip", "127.0.0.1", "Server running address")
	pflag.Int64("port", 8080, "Server running port")
	pflag.Parse()
	viper.BindPFlags(pflag.CommandLine)
	fmt.Printf("ip :%s , port:%s", viper.GetString("ip"), viper.GetString("port"))
}

獲取值

值得獲取方法名為 Get[type] 形式

接口類型,既未作解析

Get

布爾

GetBool

時(shí)間

  • GetDuration
  • GetTime

數(shù)字

  • GetInt
  • GetInt32
  • GetInt64
  • GetFloat64
  • GetIntSlice
  • ....

字符

  • GetString
  • GetStringSlice
  • ....

設(shè)置默認(rèn)值

setDefault

 viper.setConfigFile("config.yaml")
 viper.SetDefault("port", 8000)
 println(viper.GetInt("port") // 8000
 // 這里未讀取配置文件,將返回默認(rèn)值

將配置映射到結(jié)構(gòu)體

Unmarshal 將配置屬性映射到 struct 中, 匹配模式類似 JSON 解析,只匹配大寫開(kāi)頭的屬性

type User struct{
    ID string
    Name string
    nickName string // 小寫屬性將不做匹配
}
func main(){
    /* config.yaml
        id: id11
        name: Rogan
        nickName: "wolf"  
    */
    ...
    user := &User{}
    viper.Unmarshal(user)
    println(&user) // { id11, Rogan } 
}

UnmarshalExact 用法與 Unmarshal 相同, 不同的是struct 必須與配置屬性完全匹配,否則加報(bào)錯(cuò)

 /*
  config.yaml
    id: 111
    name: Rogan
 */
 type Conf_1 struct{
     Id string
     Name string
 }
 // 將報(bào)錯(cuò)
 type Conf_2 struct{
     Id string
 }

UnmarshalKey 匹配某一字段

 /*
  config.yaml
    server: 
        port: 8000
        host: localhost
 */
type ServerConf struct{
    Port int
    host string
}
func main(){
    ...
    serverConf := &ServerConf{}
    viper.UnmarshalKey("server", serverConfig)
}

混合配置 Merge[type]

MergeConfig

func main(){
    viper.SetConfigName("config")
	viper.SetConfigFile("config.yaml")
	viper.ReadInConfig()
	log.Println(viper.GetString("Summary"), viper.InConfig("Summary"))
	buff := []byte(`Name: jeck`)
	viper.MergeConfig(bytes.NewReader(buff))
	log.Println(viper.GetString("Name"))
}

監(jiān)聽(tīng)文件

WatchConfig

func main(){
	viper.SetConfigName("config")
	viper.SetConfigFile("config.yaml")
	viper.ReadInConfig()
	viper.WatchConfig()
	for {
		log.Println(viper.GetString("version"))
		time.Sleep(time.Second * 5)
	}
}
// 初始 versioni: 1
// --> 1
// 修改config.yaml version: 2
// --> 2

OnConfigChange 響應(yīng)配置變化

以上就是Go viper讀取配置文件的示例詳解的詳細(xì)內(nèi)容,更多關(guān)于go viper的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Go語(yǔ)言編譯原理之源碼調(diào)試

    Go語(yǔ)言編譯原理之源碼調(diào)試

    這篇文章主要為大家介紹了Go語(yǔ)言編譯原理之源碼調(diào)試示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • 詳解golang中模板的常用語(yǔ)法

    詳解golang中模板的常用語(yǔ)法

    這篇文章主要介紹了golang模板中的常用語(yǔ)法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-08-08
  • golang validator參數(shù)校驗(yàn)的實(shí)現(xiàn)

    golang validator參數(shù)校驗(yàn)的實(shí)現(xiàn)

    這篇文章主要介紹了golang validator參數(shù)校驗(yàn)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • Go語(yǔ)言什么時(shí)候該使用指針

    Go語(yǔ)言什么時(shí)候該使用指針

    本文主要介紹了Go語(yǔ)言什么情況下應(yīng)該使用指針,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • 讓GPT教你用go語(yǔ)言和C語(yǔ)言開(kāi)發(fā)IDE配置學(xué)習(xí)

    讓GPT教你用go語(yǔ)言和C語(yǔ)言開(kāi)發(fā)IDE配置學(xué)習(xí)

    這篇文章主要介紹了讓GPT教你用go語(yǔ)言和C語(yǔ)言開(kāi)發(fā)IDE配置學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10
  • Go語(yǔ)言中defer使用的陷阱小結(jié)

    Go語(yǔ)言中defer使用的陷阱小結(jié)

    本文主要介紹了Go語(yǔ)言中defer使用的陷阱小結(jié),分別是defer語(yǔ)句不可以在return語(yǔ)句之后,defer語(yǔ)句執(zhí)行的匿名函數(shù),匿名函數(shù)的參數(shù)會(huì)被預(yù)先處理,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-01-01
  • Golang中基于HTTP協(xié)議的網(wǎng)絡(luò)服務(wù)

    Golang中基于HTTP協(xié)議的網(wǎng)絡(luò)服務(wù)

    HTTP協(xié)議是基于TCP/IP協(xié)議棧的,并且它也是一個(gè)面向普通文本的協(xié)議。這篇文章主要詳細(xì)介紹了Golang中基于HTTP協(xié)議的網(wǎng)絡(luò)服務(wù),感興趣的小伙伴可以借鑒一下
    2023-04-04
  • Go語(yǔ)言實(shí)現(xiàn)登錄驗(yàn)證代碼案例

    Go語(yǔ)言實(shí)現(xiàn)登錄驗(yàn)證代碼案例

    這篇文章主要介紹了Go語(yǔ)言實(shí)現(xiàn)登錄驗(yàn)證代碼案例,代碼和圖文講解的很清晰,有感興趣的可以學(xué)習(xí)下
    2021-03-03
  • golang中json反序列化可能遇到的問(wèn)題

    golang中json反序列化可能遇到的問(wèn)題

    這篇文章主要給大家介紹了關(guān)于golang中json反序列化可能遇到的問(wèn)題的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-01-01
  • go從指定的URL下載圖片并保存到本地的代碼實(shí)現(xiàn)

    go從指定的URL下載圖片并保存到本地的代碼實(shí)現(xiàn)

    這段代碼定義了一個(gè)名為 downloadImage 的函數(shù),其目的是從指定的URL下載圖片并保存到本地文件系統(tǒng),本文是對(duì)代碼功能的詳細(xì)描述,對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-08-08

最新評(píng)論