【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, &paramsFuzzJson)
	if err != nil {
    
    
		fmt.Println("读取/fuzzDicts/paramsFuzz.json时,解析数据失败", err)
		os.Exit(1)
	}

	return paramsFuzzJson

}

遇到问题

需求:把项目代码编译成 exe,便于执行,避免每次执行都要启动 IDEA。

遇到问题:编译打包过程中,不会打包 Json 文件,导致程序运行时无法读取 Json 配置文件,如图。
在这里插入图片描述

解决问题

embed功能

参考:Go 1.16新特性-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, &paramsFuzzJson)
	
	return paramsFuzzJson

}

猜你喜欢

转载自blog.csdn.net/soldi_er/article/details/126158850