最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

背景

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

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

實現(xiàn)

工具

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

打包

使用 go-bindata 工具將包含敏感信息的配置文件轉(zhuǎn)換成 Go 的源代碼,下面是項目 Makefile 的部分內(nèi)容,工具名稱就叫 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 命令行工具的選項說明:

  • -pkg 指定 package 名稱,調(diào)用的寫法將變成 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)制文件交給使用者,通過這種方式可以減少工具的使用者對一些敏感信息的直接接觸,保障資源的安全性。
其實,真正要做到對資源訪問的完全把控,可以將 CLI 工具再次進(jìn)行封裝成 Jenkins job 類似的可視化操作界面,既方便使用者使用,又可以限制使用者對工具的使用范圍,包括傳遞給 CLI 工具的參數(shù)。

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

相關(guān)文章

  • GO語言中接口和接口型函數(shù)的具體使用

    GO語言中接口和接口型函數(shù)的具體使用

    本文主要介紹了GO語言中接口和接口型函數(shù)的使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • Go Struct結(jié)構(gòu)體的具體實現(xiàn)

    Go Struct結(jié)構(gòu)體的具體實現(xiàn)

    Go語言中通過結(jié)構(gòu)體的內(nèi)嵌再配合接口比面向?qū)ο缶哂懈叩臄U展性和靈活性,本文主要介紹了Go Struct結(jié)構(gòu)體的具體實現(xiàn),感興趣的可以了解一下
    2023-03-03
  • vscode上搭建go開發(fā)環(huán)境詳細(xì)完整過程

    vscode上搭建go開發(fā)環(huán)境詳細(xì)完整過程

    這篇文章主要給大家介紹了關(guān)于vscode上搭建go開發(fā)環(huán)境的詳細(xì)完整過程,Go語言或?qū)⒊蔀樾碌闹髁﹂_發(fā)語言,Go是google開發(fā)的一種靜態(tài)強類型、編譯型、并發(fā)型,并具有垃圾回收功能的編程語言,所以我們有必要學(xué)習(xí)并掌握它,需要的朋友可以參考下
    2023-10-10
  • Go語言里的new函數(shù)用法分析

    Go語言里的new函數(shù)用法分析

    這篇文章主要介紹了Go語言里的new函數(shù)用法,實例分析了new函數(shù)的功能及使用技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-02-02
  • go進(jìn)行http請求偶發(fā)EOF問題分析

    go進(jìn)行http請求偶發(fā)EOF問題分析

    go使用連接池進(jìn)行http請求,一般都能請求成功,但偶然會出現(xiàn)請求失敗返回EOF錯誤的情況,本文主要來帶大家分析一下為什么會出現(xiàn)這樣的問題并提供解決方法,需要的可以參考下
    2025-01-01
  • Go創(chuàng)建Grpc鏈接池實現(xiàn)過程詳解

    Go創(chuàng)建Grpc鏈接池實現(xiàn)過程詳解

    這篇文章主要為大家介紹了Go創(chuàng)建Grpc鏈接池實現(xiàn)過程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • 一文詳解Go語言中的Defer機制

    一文詳解Go語言中的Defer機制

    在Go語言中,defer是一個關(guān)鍵字,用于確保資源的清理和釋放,特別是在函數(shù)中創(chuàng)建的資源,下面就跟隨小編一起來了解下Defer機制的具體使用吧
    2024-11-11
  • Golang爬蟲框架 colly的使用

    Golang爬蟲框架 colly的使用

    本文主要介紹了Golang爬蟲框架 colly的使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • Goland調(diào)節(jié)字體大小的設(shè)置(編輯區(qū),terminal區(qū),頁面字體)

    Goland調(diào)節(jié)字體大小的設(shè)置(編輯區(qū),terminal區(qū),頁面字體)

    這篇文章主要介紹了Goland調(diào)節(jié)字體大小的設(shè)置(編輯區(qū),terminal區(qū),頁面字體),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • Go?實現(xiàn)?WebSockets之創(chuàng)建?WebSockets

    Go?實現(xiàn)?WebSockets之創(chuàng)建?WebSockets

    這篇文章主要介紹了Go?實現(xiàn)?WebSockets之創(chuàng)建?WebSockets,文章主要探索?WebSockets,并簡要介紹了它們的工作原理,并仔細(xì)研究了全雙工通信,想了解更多相關(guān)內(nèi)容的小伙伴可以參考一下
    2022-04-04

最新評論

正安县| 偏关县| 大新县| 舟曲县| 衡东县| 乡宁县| 双城市| 汝州市| 威远县| 邵阳县| 延津县| 岢岚县| 玉门市| 油尖旺区| 徐汇区| 合水县| 教育| 灌阳县| 大新县| 枝江市| 融水| 白河县| 当雄县| 建昌县| 察哈| 乐都县| 天全县| 兴城市| 太康县| 探索| 崇义县| 托里县| 三台县| 阿拉善盟| 阿合奇县| 松阳县| 漳平市| 舞阳县| 望都县| 隆回县| 雅江县|