思悟项目:
golang qq邮件发送验证码——思悟项目技术1
go语言gin框架平滑关闭——思悟项目技术2
Go 语言默认情况下打包并不会将静态文件直接包含在可执行文件中。Go 编译器只会打包 .go 源代码文件,静态文件(如 HTML、CSS、JS 或图片等)并不会自动包含在生成的二进制文件中。
解决方法如下:
方法一
写一个函数,返回模版文件字符串,比如:
这样我们什么时候使用这个模版,就什么时候调用这个函数。
func GetEmailFormatTemplate() string {return `<!-- 邮箱发送验证码模版 -->
<!DOCTYPE html>
<html lang="zh">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>验证码</title></head>
<body>
<div class="container"><h1>验证码通知</h1><p>亲爱的用户:</p><p>你的验证码为 <span class="code">%s</span>,有效时间为 %d 分钟。</p><div class="footer">如果您没有请求此验证码,请忽略此邮件。</div>
</div>
</body>
</html>
`
}
方法二
Gin Web框架:静态资源嵌入
例子:
目录结构为:
main.go 文件:(main.go 中缺失的一些变量在assets.go 文件中,等到我们生成 assets.go 后 main.go 文件就不会报错了)
package mainimport ("fmt""github.com/gin-gonic/gin""html/template""io/ioutil""strings"
)func main() {r := gin.New()t, err := loadTemplate()if err != nil {panic(err)}r.SetHTMLTemplate(t)r.GET("/", func(c *gin.Context) {c.JSON(200, "hello world")})r.Run(":8080")
}// loadTemplate 加载由 go-assets-builder 嵌入的模板
func loadTemplate() (*template.Template, error) {t := template.New("") // 空模版// 把从文件中读取的内容添加到这个模板中// Assets 是通过 go-assets-builder 生成的静态资源对象。Assets.Files 包含所有被打包的文件。// name 是文件的路径,file 是表示文件内容的对象。for name, file := range Assets.Files {// 打印每个被打包的文件名fmt.Println("Loaded static file:", name)// .tmpl、.html 和 .txt 文件都可以被打包并在程序中使用。if file.IsDir() || (!strings.HasSuffix(name, ".tmpl") && !strings.HasSuffix(name, ".html") && !strings.HasSuffix(name, ".txt")) {continue}h, err := ioutil.ReadAll(file)if err != nil {return nil, err}// 在模板对象 t 中创建一个新的模板(名称为 name),并将读取到的文件内容解析为模板。t, err = t.New(name).Parse(string(h))if err != nil {return nil, err}}return t, nil
}
步骤如下:
1. 安装 go-assets-builder
go install github.com/jessevdk/go-assets-builder@latest
2. 生成静态资源:使用 go-assets-builder 将静态资源打包成 Go 代码:
go-assets-builder -o assets.go template/emailFormatTemplate.html
这个命令会将 template 目录下 emailFormatTemplate.html 文件打包到 assets.go 文件中。你可以在这个文件中看到 Assets 变量的定义,它包含了静态资源。
生成了一个 assets.go 文件:
3. 编译并运行:静态资源会被打包进可执行文件中:
go build -o myapp
./myapp
解释:
- go-assets:这是将静态资源打包到 Go 二进制文件中的工具,允许你在运行时直接访问打包进来的文件。
- Assets.Files:生成的 assets.go 文件中,会创建 Assets 变量,包含所有打包的文件信息。loadTemplate 函数遍历这些文件,读取内容,并解析成模板。
- html/template:Gin 使用标准库的 html/template 来渲染 HTML 页面。
这样做的好处是,可以把所有的资源打包到一个可执行文件中,使部署更加方便,无需额外的文件管理。
其实本质上解决这个静态资源打包问题的方法都是:先读取这个模版,把静态资源转换为 Go 文件中的字节数据,并打包到最终的二进制文件中。