go 打包静态资源,前后端一把梭

 

Go embed

它的作用就是可以在Go语言应用程序中包含任何文件、目录的内容, 也就是说我们可以把文件以及目录中的内容都打包到生成的Go语言应用程序中了,部署的时候,直接扔一个二进制文件就可以了,不用再包含一些静态文件了,因为它们已经被打包到生成的应用程序中了。

embed 的基本用法

Go embed的使用非常简单,通过//go:embed指令即可

实践参考例子

文件目录参考

1712040045212.png

资源目录必须和引用embed的文件目录平齐或者为子目录,不能在上级目录,其中web为静态资源目录,commentWeb.go为引用embed的go文件

实践代码

这段代码是一个简单的Go语言程序,用于启动一个基本的Web服务器,并将静态文件嵌入到可执行文件中。


//go:embed web/*
var WebFlies embed.FS

func StartWebServer() {
	// 设置静态文件服务
	web, _ := fs.Sub(WebFlies, "web")
	fs := http.FileServer(http.FS(web))
	http.Handle("/", http.StripPrefix("/", fs))
	// 启动服务器
	log.Println("Starting web server on :" + config.LoadConfig().WebPort)
	if err := http.ListenAndServe(":"+config.LoadConfig().WebPort, nil); err != nil {
		log.Fatalf("Failed to start web server: %v", err)
	}
}

具体解释

//go:embed web/*
var WebFlies embed.FS
  • //go:embed web/*: 这是一个编译指令,表示将web/目录下的所有文件嵌入到可执行文件中。
  • var WebFlies embed.FS: 定义了一个变量WebFiles,类型为embed.FS,用于存储嵌入的文件系统。
func StartWebServer() {}
  • func StartWebServer(): 定义了一个函数StartWebServer,该函数用于启动Web服务器。
// 设置静态文件服务
  • // 设置静态文件服务: 这是一个注释,用于说明下面代码的作用,即设置静态文件服务。
web, _ := fs.Sub(WebFlies, "web")
  • web, _ := fs.Sub(WebFlies, "web"): 这一行代码用于获取嵌入文件系统中web/目录的子文件系统。fs.Sub函数接收两个参数,第一个参数是父文件系统,即WebFiles,第二个参数是要获取的子目录名。
fs := http.FileServer(http.FS(web))
  • fs := http.FileServer(http.FS(web)): 创建了一个http.FileServer对象,用于提供静态文件服务。http.FS函数将web转换为http.FileSystem类型,然后传递给http.FileServer
http.Handle("/", http.StripPrefix("/", fs))
  • http.Handle("/", http.StripPrefix("/", fs)): 将静态文件服务fs绑定到根路径/上。http.StripPrefix("/", fs)用于移除URL前缀/,以便直接访问静态文件。
// 启动服务器
log.Println("Starting web server on :" + config.LoadConfig().WebPort)
  • // 启动服务器: 这是一个注释,用于说明下面代码的作用,即启动服务器。
  • log.Println("Starting web server on :" + config.LoadConfig().WebPort): 打印日志消息,显示将要启动的Web服务器的端口号。
if err := http.ListenAndServe(":"+config.LoadConfig().WebPort, nil); err != nil {
    log.Fatalf("Failed to start web server: %v", err)
}
  • http.ListenAndServe(":"+config.LoadConfig().WebPort, nil): 启动Web服务器并监听指定端口,使用默认的路由处理器(nil)。
  • config.LoadConfig().WebPort: 通过config.LoadConfig().WebPort获取配置文件中的Web服务器端口号。
  • if err := ...: 检查启动Web服务器时是否发生了错误,如果有错误则记录错误信息并终止程序运行。

本文遵守 Attribution-NonCommercial 4.0 International 许可协议。 Attribution-NonCommercial 4.0 International