广告位联系
返回顶部
分享到

Go打包附件内容到执行文件的方法

Golang 来源:互联网 作者:佚名 发布时间:2023-09-25 22:15:18 人浏览
摘要

如果我们的应用在启动的时候需要对数据库进行初始化(比如建表等), 可以通过读取.sql文件内容直接执行. 但是, 这样会带出一个问题: 在发送可执行文件的时候, 需要连带着附件文件, 并

如果我们的应用在启动的时候需要对数据库进行初始化(比如建表等), 可以通过读取.sql文件内容直接执行. 但是, 这样会带出一个问题:

  • 在发送可执行文件的时候, 需要连带着附件文件, 并且相对路径还不能出错. 这样太麻烦了
  • 有时我们并不希望附件的内容被使用者看到

处于种种原因, 我们不希望这部分额外的内容以附件的形式出现, 有没有什么办法能够将附件内容直接打包进可执行文件中呢?

打包方法

直接在文件中定义

最容易想到的, 就是直接在.go文件中定义字符串, 比如这样:

1

var text = `xxx`

如此处理必然是可以的, 但有些不方便.

  • .sql文件可能是通过mysqldump导出的, 每次导出之后还需要将内容复制到.go文件中
  • 在编辑.sql文件的时候, IDE会提供语法高亮及输入提示, 这些在字符串中都是没有的

通过工具转换

既然我们想要将内容直接放在文件中, 同时又想将内容打包到二进制中. 是否可以通过脚本处理呢? 脚本从附件中读取内容, 并写入到.go文件中.

有一个名为go-bindata 的工具, 做的就是这样的事情. 具体操作可自行搜索, 这里不做赘述.

但是这个工具在3年前就不再更新了, 为什么呢? 因为官方支持了.

go build

或许是因为这样的呼声太大, 在go 1.16版本开始, 官方增加了embed包对这种操作进行了支持, 可以在编译阶段直接将静态资源打包到二进制中.

其大致用法如下:

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

import "embed"

 

// 将内容直接打包到二进制文件中

//go:embed test.txt

var test string

 

//go:embed test.txt

var test1 []byte

 

// 同时打包多个文件. 后接文件名或目录

//go:embed test.txt dir

// 作为文件

var test2 embed.FS

 

func main() {

    // 输出文件内容

    println(test)

    println(string(test1))

     

    b, err := test2.ReadFile("test.txt")

    if err != nil {

        panic(err)

    }

    println(string(b))

}

其中string/[]byte用来打包单个文件, embed.FS可以打包一批文件. 使用也比较简单, 看下文档就行了.

至此, Go程序已经可以天然且方便的将资源文件进行打包了.

总结

OK, 现在已经完美解决了我们最开始的问题, 以后在项目中遇到类似的需求, 可以直接使用啦.

至于其他语言, 比如PHP/Python等, 本来就是一堆源文件, 不会打包成二进制, 应该也不会有这种需求吧.


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 :
相关文章
  • Go语言中rune方法使用介绍

    Go语言中rune方法使用介绍
    1.byte类型 byte类型是uint8的别名,表示一个字节, 2.rune类型 rune类型是Go语言中的一个基本类型,其实就是一个int32的别名,主要用于表示一个
  • Go打包附件内容到执行文件的方法
    如果我们的应用在启动的时候需要对数据库进行初始化(比如建表等), 可以通过读取.sql文件内容直接执行. 但是, 这样会带出一个问题: 在发送
  • go连接kafka的实现教程
    要在Go语言中连接Kafka,需要使用Kafka的Go客户端库,例如sarama。sarama是一个纯Go实现的Kafka客户端库,提供了连接Kafka集群、发送和接收消息等
  • golang占位符的详细介绍
    xdm ,写 C/C++ 语言的时候有格式控制符,例如 %s , %d , %c , %p 等等 在写 golang 的时候,也是有对应的格式控制符,也叫做占位符,写这个占位
  • Go语言实现的微服务性能优化工具介绍
    引言: 随着微服务架构的流行,越来越多的企业开始采用微服务来构建他们的应用程序。然而,由于微服务的分布式特性,往往会面临性能
  • 使用Go语言进行代码优化的介绍
    在日常开发中,我们经常需要优化代码,以提高程序的性能和效率。Go语言作为一门高效的编程语言,提供了许多优化技巧和工具来帮助我们
  • Go框架三件套Gorm Kitex Hertz基本用法与常见API介绍
    Gorm、Kitex、Hertz的基本用法与常见的API讲解 Gorm gorm是Golang语言中一个已经迭代数十年且功能强大、性能极好的ORM框架 ORM:Object Relational Map
  • GoLang sync.Pool的介绍与用法
    一句话总结:保存和复用临时对象,减少内存分配,降低GC压力 sync.Pool是可伸缩的,也是并发安全的,其大小仅受限于内存大小。sync.Pool用
  • Windows下升级go版本过程介绍
    首次安装需要在官网下载 msi 安装包,安装完后 golang 会自动设置环境变量。在命令行可以使用 go version 查看版本信息。 后续如果需要升级
  • GO利用channel协调协程的实现介绍
    go 当中的并发编程是通过goroutine来实现的,利用channel(管道)可以在协程之间传递数据,实现协程的协调与同步。 使用 新建一个管道,使
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计