ThinkSSL🔒 一键申购 5分钟快速签发 30天无理由退款 购买更放心 广告
[TOC] ## 概述 - 将 任意 文件转成 go 源码。它还可以帮你把数据 压缩一下 。常用于将数据嵌入程序. 这些资源文件变成源码之后,数据储存在字节切片中 (raw byte slice),只需要导入生成的源码,调用几个简单的函数就可访问,反正比 文件 IO 来得**简单和快**。因为是源码,也会加入编译,最后**包含在可执行文件中**,发布时也就不再需要带着资源文件 ## 实例 ### hello world <details> <summary>assets/a.txt</summary> ``` hello word hello word ``` </details> <br/> <details> <summary>main.go</summary> ``` package main import ( "demo/bindata" "fmt" ) func main() { // bindata 为 -pkg 指定的包名 file, err :=bindata.Asset("test/asd") if err != nil { fmt.Printf("%+v\n", err) } fmt.Printf("%+v\n", string(file)) } ``` </details> <br/> ``` > go mod init demo // 第一步:生成 bin-data > go-bindata -o=bindata/bindata.go -ignore="\\.DS_Store|desktop.ini|README.md" -pkg=bindata assets/... > go build main.go > main // hello word hello word ``` ### 使用Makefile <details> <summary>assets/a.txt</summary> ``` hello word hello word ``` </details> <br/> <details> <summary>main.go</summary> ``` package main import ( "demo/bindata" "fmt" ) func main() { file, err :=bindata.Asset("assets/a.txt") if err != nil { fmt.Printf("%+v\n", err) } fmt.Printf("%+v\n", string(file)) } ``` </details> </details> <br/> <details> <summary>Makefile</summary> ``` # 设置输出文件目录 BINDATA_PATH = bindata # 设置输出的 go 文件名 BINDATA_NAME = bindata # 设置 pkg 的报名 BINDATA_PACKAGE = bindata # 静态资源路径 BINDATA_DIR = assets # ignore list 还是建议定义一个宏,方便随时添加 BINDATA_IGNORE = "\\.DS_Store|desktop.ini|README.md" .PHONY: bindata build all: build build: bindata go build -o main.exe bindata: go-bindata -o=$(BINDATA_PATH)/$(BINDATA_NAME).go -ignore=$(BINDATA_IGNORE) -pkg=$(BINDATA_PACKAGE) $(BINDATA_DIR)/... ``` </details> <br/> ``` > go mod init demo > make build > main.exe // hello word hello word ``` ### 考虑配置文件 如果涉及到配置文件,则最好允许用户修改配置,则需要把关于配置相关的静态文件重新以文件形式存在, 并可通过参数的形式显示生成 只需要第二个实例的 main.go 修改 <details> <summary>main.go</summary> ``` package main import ( "demo/bindata" "fmt" ) func init() { // 如果执行了 main install, 则生成配置文件 if len(os.Args)>1 && os.Args[1]=="install" { // 注意第一dir 参数为空 err := bindata.RestoreAssets("", "assets/a.txt") if err != nil { panic(err) } } } func main() { file, err :=bindata.Asset("assets/a.txt") if err != nil { fmt.Printf("%+v\n", err) } fmt.Printf("%+v\n", string(file)) } ``` </details> ``` > go mod init demo > make build > main.exe install //会生成配置文件 ```