Go编程打包 Json 文件到 exe 程序
Posted Web3Ao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Go编程打包 Json 文件到 exe 程序相关的知识,希望对你有一定的参考价值。
文章目录
问题描述
当前编程
软件需求:漏洞扫描器需要一个配置文件,用于存放不同漏洞的 Payload。
解决方式:创建 paramsFuzz.json 文件,定义多层嵌套的 Json 数据格式。然后在 main.go 中定义对应数据格式的结构体,把配置文件中的数据读取到程序中,运行没有问题。
main.go 相关的主要代码如下:
// ParamsFuzzJson 定义配置文件解析后的结构
type ParamsFuzzJson struct
Data []ParamData `json:"data"`
ParamsWhiteArray []string `json:"params_white_list"`
ParamsHazardArray []ParamsHazardData `json:"params_hazard"`
func read_paramsPayload() ParamsFuzzJson
var paramsFuzzJson ParamsFuzzJson
bytes, err := ioutil.ReadFile("./fuzzDicts/paramsFuzz.json")
if err != nil
fmt.Println("读取json文件失败", err)
os.Exit(1)
// 把文件内容赋值给定义的结构体
err = json.Unmarshal(bytes, ¶msFuzzJson)
if err != nil
fmt.Println("读取/fuzzDicts/paramsFuzz.json时,解析数据失败", err)
os.Exit(1)
return paramsFuzzJson
遇到问题
需求:把项目代码编译成 exe,便于执行,避免每次执行都要启动 IDEA。
遇到问题:编译打包过程中,不会打包 Json 文件,导致程序运行时无法读取 Json 配置文件,如图。
解决问题
embed功能
embed:embed是在Go 1.16中新加包。它通过//go:embed指令,可以在编译阶段将静态资源文件打包进编译好的程序中,并提供访问这些文件的能力。
embed的三种数据类型及使用:在embed中,可以将静态资源文件嵌入到三种类型的变量,分别为:字符串、字节数组、embed.FS文件类型。
将文件内容嵌入到字节数组变量中-示例:
package main
import (
_ "embed"
"fmt"
)
//go:embed version.txt
var versionByte []byte
func main()
fmt.Printf("version %q\\n", string(versionByte))
应用 embed - 成功
易错点://go:embed
指令只能用在包级别的全局变量中,不能用在函数或方法内,否则在编译的时候会报"go:embed cannot apply to var inside func"错误。
应用步骤:
- 复制 Json 文件到 main.go 所在目录,便于寻找文件
- 全局变量中以字节形式读取文件,因为与 ioutil.ReadFile() 读取的都是字节,便于调试
- 运行调试,发现可以打包并且正常执行
更改后的代码:
// ParamsFuzzJson 定义配置文件解析后的结构
type ParamsFuzzJson struct
Data []ParamData `json:"data"`
ParamsWhiteArray []string `json:"params_white_list"`
ParamsHazardArray []ParamsHazardData `json:"params_hazard"`
//go:embed paramsFuzz.json
var payloadByte []byte
func read_paramsPayload() ParamsFuzzJson
var paramsFuzzJson ParamsFuzzJson
json.Unmarshal(payloadByte, ¶msFuzzJson)
return paramsFuzzJson
以上是关于Go编程打包 Json 文件到 exe 程序的主要内容,如果未能解决你的问题,请参考以下文章