Saki's 研究记录

golang embed 使用

字数统计: 566阅读时长: 2 min
2021/12/29

简介

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

样例

目录结构

创建目录:

1
mkdir -p embed_example/{static,templates}

目录结构:

1
2
3
4
5
6
7
8
9
10
11
12
cd embed_example; tree
.
├── go.mod
├── go.sum
├── hello.txt
├── main.go
├── static
│   └── pics.jpeg
└── templates
└── index.html

2 directories, 6 files

文件信息

  • main.go : 实现代码
  • hello.txt : 内容为hello,world!的文本文件
  • static/pics.jpeg : 一张名为pics.jpeg的图片
  • templates/index.html : 一个名为index.htmlHTML格式文件

代码

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
30
31
32
33
34
package main

import (
"embed"
"fmt"
"github.com/gin-gonic/gin"
"html/template"
"io/fs"
"net/http"
)

//go:embed static templates
var FS embed.FS

//go:embed hello.txt
var s string

func main() {
fmt.Println(s) // <----- hello.txt 的内容!

gin.SetMode(gin.DebugMode)
r := gin.Default()
templ := template.Must(template.New("").ParseFS(FS, "templates/*.html"))
r.SetHTMLTemplate(templ)

fe, _ := fs.Sub(FS, "static")
r.StaticFS("/static", http.FS(fe))

r.GET("/", func(c *gin.Context) {
c.HTML(http.StatusOK, "index.html", gin.H{})
})

r.Run(":8080")
}

运行

编译运行

执行go build生成的可执行文件:

1
go build -o server main.go

运行可执行文件./server:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
hello,world!  <----- hello.txt 的内容!

[GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.

[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
- using env: export GIN_MODE=release
- using code: gin.SetMode(gin.ReleaseMode)

[GIN-debug] GET /pic/*filepath --> github.com/gin-gonic/gin.(*RouterGroup).createStaticHandler.func1 (3 handlers)
[GIN-debug] HEAD /pic/*filepath --> github.com/gin-gonic/gin.(*RouterGroup).createStaticHandler.func1 (3 handlers)
[GIN-debug] GET / --> main.main.func1 (3 handlers)
[GIN-debug] [WARNING] You trusted all proxies, this is NOT safe. We recommend you to set a value.
Please check https://pkg.go.dev/github.com/gin-gonic/gin#readme-don-t-trust-all-proxies for details.
[GIN-debug] Listening and serving HTTP on :8080

访问

浏览器访问 http://127.0.0.1:8080 ,请求注册的接口:

  • http://127.0.0.1:8080/static/pics.jpeg : 图片pics.jpeg
  • http://127.0.0.1:8080/ : templates/index.html

工程中的静态文件已经被打包到编译后的可执行文件中了。

以上。

CATALOG
  1. 1. 简介
  2. 2. 样例
    1. 2.1. 目录结构
    2. 2.2. 代码
  3. 3. 运行
    1. 3.1. 编译运行
    2. 3.2. 访问