• 【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
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    遇到问题

    需求:把项目代码编译成 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))
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    应用 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
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
  • 相关阅读:
    Linux基础知识,这里有很多内容可以看看~
    【期中复习】深度学习
    docker笔记7:Docker微服务实战
    ant Design vue中a-row 内容不会垂直居中
    认识物联网
    C++day3
    GLSL-WebGL着色器语言语法详解
    ArduPilot开源飞控之AP_Baro_ExternalAHRS
    html关闭空标签
    C/C++微实践 - 发现圆周率
  • 原文地址:https://blog.csdn.net/soldi_er/article/details/126158850