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

Golang打包配置文件的實(shí)現(xiàn)示例

 更新時(shí)間:2021年12月07日 16:22:55   作者:K8sCat  
本文主要介紹了Golang打包配置文件的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

眾所周知,Golang 適合寫(xiě) CLI 工具,但你可能還不知道 Golang 還可以打包配置文件。

背景

最近在寫(xiě)一個(gè)涉及到管理阿里云 ECS 的 CLI 工具,這里當(dāng)然就要考慮阿里云資源使用的安全性了,要求阿里云賬號(hào)的 AccessKeyId 和 AccessKeySecret 不能下發(fā)給 CLI 工具的使用者。

所以這里選擇將一份包含 AccessKeyId 和 AccessKeySecret 的配置文件打包進(jìn)了 CLI 工具中,CLI 工具的使用者默認(rèn)將使用已經(jīng)打包了的配置文件,當(dāng)然也可以通過(guò)指定配置文件或傳遞參數(shù)的方式使用新的配置信息。

實(shí)現(xiàn)

工具

這里將介紹 Golang 的一個(gè)可以把任意文件轉(zhuǎn)換成 Go 代碼的庫(kù) go-bindata,可以用于嵌入二進(jìn)制文件到 Go 程序中。同時(shí),也支持在轉(zhuǎn)換成原始的字節(jié)切片前使用 gzip 進(jìn)行壓縮文件數(shù)據(jù)。
關(guān)于該工具的具體介紹請(qǐng)?zhí)D(zhuǎn)至 https://github.com/go-bindata/go-bindata

打包

使用 go-bindata 工具將包含敏感信息的配置文件轉(zhuǎn)換成 Go 的源代碼,下面是項(xiàng)目 Makefile 的部分內(nèi)容,工具名稱(chēng)就叫 mycli 吧。

NAME = mycli
CONFIG = configs/config.yaml

.PHONY: build

build:
    cp $(CONFIG) config.yaml
    mkdir -p cmd/mycli/asset
    go-bindata -pkg asset -o cmd/mycli/asset/asset.go \
        scripts/... \
        config.yaml
    
    CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o bin/linux/mycli cmd/mycli/*.go
    CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build -o bin/darwin/mycli cmd/mycli/*.go
    
    chmod +x ./bin/linux/mycli ./bin/darwin/mycli
    rm -f config.yaml mycli
    ln -s bin/linux/mycli mycli

其中將文件轉(zhuǎn)換成 Go 源代碼的部分如下:

go-bindata -pkg asset -o cmd/mycli/asset/asset.go \
    scripts/... \
    config.yaml

關(guān)于 go-bindata 命令行工具的選項(xiàng)說(shuō)明:

  • -pkg 指定 package 名稱(chēng),調(diào)用的寫(xiě)法將變成 asset.Asset("config.yaml")
  • -o 指定生成的 Go 源代碼存放的位置

生成的 asset.go 代碼如下:

// Code generated by go-bindata.
// sources:
// scripts/create.sh
// scripts/sub/delete.sh
// config.yaml
// DO NOT EDIT!

package asset

func bindataRead(data []byte, name string) ([]byte, error) {
    ...
}

type asset struct {
 bytes []byte
 info  os.FileInfo
}

type bindataFileInfo struct {
 name    string
 size    int64
 mode    os.FileMode
 modTime time.Time
}

func (fi bindataFileInfo) Name() string {
 return fi.name
}
func (fi bindataFileInfo) Size() int64 {
 return fi.size
}
func (fi bindataFileInfo) Mode() os.FileMode {
 return fi.mode
}
func (fi bindataFileInfo) ModTime() time.Time {
 return fi.modTime
}
func (fi bindataFileInfo) IsDir() bool {
 return false
}
func (fi bindataFileInfo) Sys() interface{} {
 return nil
}

...

調(diào)用

使用 Asset 方法進(jìn)行加載打包好的配置文件:

const preloadConfigFile = "config.yaml"

type Config struct {
    ...
}

func PreloadConfig() (*Config, error) {
    b, err := asset.Asset(preloadConfigFile)
    if err != nil {
        return nil, fmt.Errorf("failed to read config: %v", err)
    }
    var config *Config
    err = yaml.Unmarshal(b, &config)
    return config, err
}

總結(jié)

使用 go-bindata 將文件轉(zhuǎn)換成 Go 的源代碼,然后編譯成二進(jìn)制文件,最終只需要將二進(jìn)制文件交給使用者,通過(guò)這種方式可以減少工具的使用者對(duì)一些敏感信息的直接接觸,保障資源的安全性。
其實(shí),真正要做到對(duì)資源訪(fǎng)問(wèn)的完全把控,可以將 CLI 工具再次進(jìn)行封裝成 Jenkins job 類(lèi)似的可視化操作界面,既方便使用者使用,又可以限制使用者對(duì)工具的使用范圍,包括傳遞給 CLI 工具的參數(shù)。

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

相關(guān)文章

  • Go操作Kafka和Etcd方法詳解

    Go操作Kafka和Etcd方法詳解

    這篇文章主要為大家介紹了Go操作Kafka和Etcd方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • 一文初探Go語(yǔ)言中的reflect反射包

    一文初探Go語(yǔ)言中的reflect反射包

    這篇文章主要和大家分享一下Go語(yǔ)言中的reflect反射包,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Go語(yǔ)言有一定的幫助,需要的小伙伴可以參考一下
    2022-12-12
  • 深入解析Go語(yǔ)言中上下文超時(shí)與子進(jìn)程管理

    深入解析Go語(yǔ)言中上下文超時(shí)與子進(jìn)程管理

    這篇文章小編將通過(guò)一個(gè)實(shí)際問(wèn)題的案例,和大家深入探討一下Go語(yǔ)言中的上下文超時(shí)和子進(jìn)程管理,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-10-10
  • GoLand利用plantuml生成UML類(lèi)圖

    GoLand利用plantuml生成UML類(lèi)圖

    本文主要介紹了GoLand利用plantuml生成UML類(lèi)圖,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • 詳解Go中處理時(shí)間數(shù)據(jù)的方法

    詳解Go中處理時(shí)間數(shù)據(jù)的方法

    在許多場(chǎng)合,你將不得不編寫(xiě)必須處理時(shí)間的代碼。在Go中處理時(shí)間數(shù)據(jù)需要你從Go標(biāo)準(zhǔn)庫(kù)中導(dǎo)入?time?包。這個(gè)包有很多方法和類(lèi)型供你使用,但我選取了最常用的方法和類(lèi)型,并在這篇文章中進(jìn)行了描述,感興趣的可以了解一下
    2023-04-04
  • Golang匯編之控制流深入分析講解

    Golang匯編之控制流深入分析講解

    這篇文章主要介紹了Golang匯編之控制流,程序執(zhí)行的流程主要有順序、分支和循環(huán)幾種執(zhí)行流程,本節(jié)主要討論如何將Go語(yǔ)言的控制流比較直觀(guān)地轉(zhuǎn)譯為匯編程序,或者說(shuō)如何以匯編思維來(lái)編寫(xiě)Go語(yǔ)言代碼,感興趣的同學(xué)可以參考下文
    2023-05-05
  • 十個(gè)示例帶你深入了解Go語(yǔ)言中的接口

    十個(gè)示例帶你深入了解Go語(yǔ)言中的接口

    這篇文章主要是通過(guò)十個(gè)簡(jiǎn)單的示例帶大家深入了解一下Go語(yǔ)言中接口的使用,文中的示例代碼簡(jiǎn)潔易懂,具有一定的學(xué)習(xí)價(jià)值,需要的可以了解一下
    2023-02-02
  • golang?用msgpack高效序列化的案例

    golang?用msgpack高效序列化的案例

    msgpack是一個(gè)非常受歡迎的Go序列化庫(kù),具有很好的跨語(yǔ)言支持,這篇文章主要介紹了golang?用msgpack高效序列化的相關(guān)知識(shí),需要的朋友可以參考下
    2023-05-05
  • golang在GRPC中設(shè)置client的超時(shí)時(shí)間

    golang在GRPC中設(shè)置client的超時(shí)時(shí)間

    這篇文章主要介紹了golang在GRPC中設(shè)置client的超時(shí)時(shí)間,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-04-04
  • 使用go來(lái)操作redis的方法示例

    使用go來(lái)操作redis的方法示例

    今天小編就為大家分享一篇關(guān)于使用go來(lái)操作redis的方法示例,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-04-04

最新評(píng)論