首页 > 其他分享 >Go每日一库之179:env(将系统环境变量解析到结构体的库)

Go每日一库之179:env(将系统环境变量解析到结构体的库)

时间:2023-09-29 21:23:56浏览次数:46  
标签:tmp 179 数据类型 MyTime 一库 env 解析 环境变量

该包的实现是基于标准库os/env包中的相关函数(比如Getenv)来获取系统的环境变量的。获取到环境变量值后,再通过结构体中的tag,将值映射到对应的结构体字段上。

使用示例

下面是将系统的一些环境变量映射到config结构体的示例。如下:

我们可以像以下这样运行该代码:

$ PRODUCTION=true HOSTS="host1:host2:host3" DURATION=1s go run main.go
{Home:/your/home Port:3000 IsProduction:true Hosts:[host1 host2 host3] Duration:1s}

从上述示例中我们看到config结构体中的字段有不同的类型。也就是说可以将环境变量解析成不同的数据类型。

接下来,我们看看env包都支持哪些数据类型。

支持的数据类型

env包支持的数据类型如下:

  • string
  • bool
  • int
  • int8
  • int16
  • int32
  • int64
  • uint
  • uint8
  • uint16
  • uint32
  • uint64
  • float32
  • float64
  • time.Duration
  • encoding.TextUnmarshaler
  • url.URL

当然,指针、切片、指针切片以及map这些数据类型也支持。同时,该包还支持通过自定义类型解析函数来支持自定义的数据类型。

自定义类型解析函数

如果你要解析的数据类型不是go内置的数据类型,那么你也可以通过自定义类型解析函数来进行解析。下面示例演示了如何将环境变量的值映射到自定一的MyTime类型字段上。如下:

type MyTime time.Time

func (t *MyTime) UnmarshalText(text []byte) error {
 tt, err := time.Parse("2006-01-02", string(text))
 *t = MyTime(tt)
 return err
}

type Config struct {
 SomeTime MyTime env:"SOME_TIME"
}

我们定义了一个MyTime类型,同时给这个类型定义了一个UnmarshalText方法。这样,在Config结构体中就可以将SOME_TIME的环境变量值解析到Config的SomeTime字段上。

从文件中解析环境变量

env包通过给结构体字段设置file标签就可以支持从文件中解析环境变量到结构体上。如下:

package main

import (
 "fmt"
 "time"
 "github.com/caarlos0/env/v9"
)

type config struct {
 Secret       string   env:"SECRET,file"
 Password     string   env:"PASSWORD,file" envDefault:"/tmp/password"
 Certificate  string   env:"CERTIFICATE,file,expand" envDefault:"${CERTIFICATE_FILE}"
}

func main() {
 cfg := config{}
 if err := env.Parse(&cfg); err != nil {
  fmt.Printf("%+v\n", err)
 }

fmt.Printf("%+v\n", cfg)
}

可以通过以下方式运行:

$ echo qwerty > /tmp/secret
$ echo dvorak > /tmp/password
$ echo coleman > /tmp/certificate

$ SECRET=/tmp/secret  \
 CERTIFICATE_FILE=/tmp/certificate \
 go run main.go
{Secret:qwerty Password:dvorak Certificate:coleman}

如果需要了解更多该包的用处,请参考github上的官方文档:https://github.com/caarlos0/env

标签:tmp,179,数据类型,MyTime,一库,env,解析,环境变量
From: https://www.cnblogs.com/arena/p/17737369.html

相关文章

  • Go每日一库之178:chromedp(一个基于Chrome DevTools协议的库,支持数据采集、截取网页长
    该库提供了一种简单、高效、可靠的方式来控制Chrome浏览器进行自动化测试和爬取数据。项目地址:https://github.com/chromedp/chromedp它可以模拟用户在浏览器中执行各种操作,如点击、输入文本、截取网页长图、将网页内容转换成pdf文档、下载图片等,从而获取到需要采集的数据。基......
  • Go每日一库之176:filetype(文件类型鉴别)
    filetype(https://github.com/h2non/filetype)是一个Go语言的第三方库,可以根据文件的魔数(magicnumbers)签名来推断文件的类型和MIME类型。它支持多种常见的文件类型,包括图片、视频、音频、文档、压缩包等。它还提供了一些便捷的函数和类型匹配器,可以方便地对文件进行分类和筛选......
  • Go每日一库之174:delve (Go 调试工具)
    简介Delve 用来调试 Go 语言开发的程序,该工具的目标是为 Go 语言提供一个简单、功能齐全的调试工具。为什么不推荐gdb• gdb对Go的调试支持是通过一个python脚本文件 src/runtime/runtime-gdb.py 扩展的,功能有限• gdb只能做到最基本的变量打印,却理解不了go......
  • Go每日一库之173:Pie (高性能、类型安全的slice操作库)
    在Go语言中,对slice和map是我们最常用的数据结构。比如,计算两个切片的交集、差集;判断切片中的元素是否都满足某个条件的等。我推荐大家使用这个包:[elliotchance/pie](https://github.com/elliotchance/pie)。该包封装了对切片和map的常用操作,能满足工作中的大部分需求。比如计算......
  • Go每日一库之172:go-prompt
    简介受python提示工具包的启发,在Go中构建强大的交互式提示一、代码示例packagemainimport( "fmt" "github.com/c-bata/go-prompt")funccompleter(dprompt.Document)[]prompt.Suggest{ s:=[]prompt.Suggest{ {Text:"users",Description:"Store......
  • Go每日一库之133:lo(基于泛型的 Golang lodash 库)
    近日,Go核心开发团队终于宣布了Go1.18正式版本的发布!这是一个大家期待很久的版本!Go1.18包含大量新功能:模糊测试、性能改进、工作区等,以及Go语言开源以来最大的一次语法特性变更——支持泛型!支持泛型后,我们便不再需要写如下冗余的代码:现在只需要简单的一行即可:funcMi......
  • Go每日一库之132:wasm与tinygo
    WASM的概念,这几年还是挺火的,新的语言,比如Rust、Go、Swift等,都对WASM提供支持。相比之下,Go语言的简单性,使得对WASM的支持,使用起来也较简单。本文是目前公开资料中为数不多较完整的教程,希望能对你有帮助。WASM是什么标题说:“Golang中的Wasm太棒了。”,但请用几句话来说......
  • Go每日一库之131:caddy(轻量web服务器)
    一直以来,我都是使用Nginx作为Web服务器,但是配置可以说是非常麻烦了。每次我要新开一个域名,都要先使用acme.sh签发SSL证书,然后再写配置,大概要花上5分钟的时间。曾经想过写个脚本自动完成这些工作,但是苦于对Linux的了解不多,也就作罢了。最近看到了Caddy,一个用Go写的......
  • Go每日一库之130:go-humanize(人性化显示)
    go-humanize是一个「人性化」的Go语言库,人性化的意思不是形容这个Go语言库,而是这个Go语言库实现的功能,它可以把数字、时间、容量等转换为我们人类容易理解的词语,比如硬盘的容量是82854982bytes,我们可不太好理解,但是如果说容量是83M,那就好理解了,go-humanize干的就是这个事情。......
  • Go每日一库之129:promu(Prometheus构建发布工具)
    众所周知,Go语言中打包命令是gobuild。在项目中,你可以单独使用gobuild命令对项目进行编译打包,也可以根据自己的需要,在该命令后加各种参数。prometheus官方为了统一项目(包括prometheus、alertmanager和各种官方的exporter)的编译和打包,开发了promu工具。官方对promu工具......