Go的高性能,使它天生适合开发io方面的服务,Web服务当然不再话下。同时,Go编译后生成的单文件不是字节码,而是对应平台的机器码,因此它效率更高、资源占用更低。

为了更好的进程程序管理,移动程序时更加方便,本文将尝试将Web服务的资源文件打包到Go生成的二进制文件中。

本文将使用一个开源项目“go-bindata-assetfs”来实现目标。该项目的基本原理非常简单,这里描述如下:

1、读取指定的目录,递归的将文件相对路径和字节流的对应关系用变量定义和byte字面值来保存在“bindata.go”文件中。

f169f74ec521fcf8f71ff0fcc57a8fac.png

2、“bindata.go”文件参与项目编译与构建,从而将文件数据打包进最终生成的二进制文件中。

3、在Web服务需要的地方,构造“http.FileServer”所需要的“FileSystem”参数。此项目自己定义了“AssetFS”结构体,实现了“FileSystem”接口所需要的“Open”方法,在收到request访问指定文件时,由“AssetFS”定义的“Open”方法,经由相关逻辑,直接返回该文件的字节流。

cc0c06142c5b0f92460504f01f284124.png

本例中使用VSCode进行开发与构建,在进行开发前,首先需要先配置VSCode的Go开发环境,并保证所有的Go相关exe可直接在cmd中运行。相关步骤如下:

1、新建工程目录,并创建“main.go”,输入代码。

2、在VSCode终端中执行命令:go get github.com/jteeuwen/go-bindata/...

go get github.com/elazarl/go-bindata-assetfs/...

b93c94f5e5cebb3219bdc4ca6ae521f8.png

3、创建“static”目录,将相关html/js/css文件都放在该文件夹下。

f5d1768f870c4d9552ec4ba621a4697a.png

4、在终端中执行命令:go-bindata-assetfs static/...

执行完毕之后,工程目录下会自动生成“bindata.go”文件,该文件下包含“static”文件夹下的所有文件的字节流定义。

e1bf2af6e5db98bc39bc01f40756f19e.png

5、定义Web服务相关逻辑,代码如下:func startWebServer() {

log.Println("starting web server...")

//动态请求1。

http.HandleFunc("/rpc/", ideaLicenseHandler)

//动态请求2。

http.HandleFunc("/getUserList", getUserListHandler)

//静态请求,由AssetFS统一处理。

http.Handle("/", http.FileServer(assetFS()))

err := http.ListenAndServe(fmt.Sprintf(":%d", serverPort), nil)

if err != nil {

log.Panic("ListenAndServe: ", err)

}

}

至此,Web服务开发完毕,相关静态资源文件也已打包到二进制文件中。可以打开浏览器查看效果。

f95468e39f1edeabc545cbbcff5e1fd4.png