点击上方蓝色“飞雪无情”关注我,设个星标,第一时间看文章

什么是 Go embed

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

embed 的基本用法

Go embed的使用非常简单,通过//go:embed指令即可,下面我通过一个例子说明:

package main
import ("embed""fmt"
)
//go:embed fire
var s string
//go:embed fire
var b []byte
//go:embed templates
var fs embed.FS
func main() {fmt.Println(s)fmt.Println(string(b))data, err := fs.ReadFile("templates/index.tmpl")fmt.Println(err,string(data))
}

以上代码中,主要是通过//go:embed指令达到读取文件内容的目的。//go:embed指令后可以是一个文件,也可以是多个文件(空格隔开即可),也可以是一个目录。
其中string[]byte类型都只能匹配一个文件,如果要匹配多个文件或者一个目录,就要使用embed.FS类型。

特别注意:embed这个包一定要导入,如果导入不使用的话,使用 _ 导入即可。

embed 在http web中的使用

看到embed这个功能,你首先想到的应该是把以前开发Web应用时使用的静态文件、模板文件打包进应用程序中,所以接下来就来看下embed如何在http web中使用。

下面先来看一个使用http托管静态文件的示例

package main
import ("embed""net/http"
)
//go:embed static
var static embed.FS
func main() {http.ListenAndServe(":8080", http.FileServer(http.FS(static)))
}

看到了吧就是这么简单,就是这么魔幻,几行代码就实现了静态文件的Web托管,并且可以结合embed特性把静态static目录里的内容全部打包到生成的应用程序中,部署非常方便。
以上代码的核心除了//go:embed指令外,还有通过http.FS这个函数,把embed.FS类型的static转换为http.FileServer函数可以识别的http.FileSystem类型。

embed 在模板中的应用

在Go Web的开发中,除了静态文件外,还有Go Template,可以更好的帮助我们渲染Web网页。下面来下看embed是如何被Go 模板使用的。

package main
import ("embed""html/template""net/http"
)
//go:embed templates
var tmpl embed.FS
func main() {t, _ := template.ParseFS(tmpl, "templates/*.tmpl")http.HandleFunc("/", func(rw http.ResponseWriter, r *http.Request) {t.ExecuteTemplate(rw,"index.tmpl",map[string]string{"title":"Golang Embed 测试"})})http.ListenAndServe(":8080",nil)
}

从以上示例中可以看到,template包提供了ParseFS函数,可以直接从一个embed.FS中加载模板,然后用于HTTP Web中。模板文件夹的结构如下所示:

templates
└── index.tmpl

Gin 框架

Gin是一个非常流行的框架,它对于静态文件以及HTML模板支持的也非常好,现在我们来看下它和embed如何结合使用。

Gin静态文件服务

Gin框架中托管一个静态文件服务非常简单,使用Static方法即可,下面看个例子:

package main
import ("embed""github.com/gin-gonic/gin""net/http"
)
//go:embed static
var static embed.FS
func main() {r:=gin.Default()r.StaticFS("/",http.FS(static))r.Run(":8080")
}

从以上示例中可以看到,在Gin中使用embed作为静态文件,也是用过http.FS函数转化的。

Gin HTML 模板

同样的,embed也可以用于Gin的HTML模板中,示例如下:

package main
import ("embed""github.com/gin-gonic/gin""html/template"
)
//go:embed templates
var tmpl embed.FS
//go:embed static
var static embed.FS
func main() {r:=gin.Default()t, _ := template.ParseFS(tmpl, "templates/*.tmpl")r.SetHTMLTemplate(t)r.GET("/", func(ctx *gin.Context) {ctx.HTML(200,"index.tmpl",gin.H{"title":"Golang Embed 测试"})})r.Run(":8080")
}

和前面的模板例子一样,也是通过template.ParseFS函数先加载embed中的模板,然后通过Gin的SetHTMLTemplate设置后就可以使用了。

Fiber

在Fiber中要使用embed托管一个静态文件服务,需要使用它的FileSystem,看如下示例。

package main
import ("embed""github.com/gofiber/fiber/v2""github.com/gofiber/fiber/v2/middleware/filesystem""net/http"
)
//go:embed templates
var tmpl embed.FS
//go:embed static
var static embed.FS
func main() {app := fiber.New()app.Use("/", filesystem.New(filesystem.Config{Root: http.FS(static),}))app.Listen(":3000")
}

同样的也是使用http.FS函数,然后结合fiber提供的filesystem达到静态托管文件服务的目的。

运行这段程序,然后在浏览器中输入http://127.0.0.1:3000/static/index.html即可看到效果。

搞定了静态文件托管,那么Fiber HTML模板也就比较容易了,代码如下所示:

package main
import ("embed""github.com/gofiber/fiber/v2""github.com/gofiber/template/html""net/http"
)
//go:embed templates
var tmpl embed.FS
func main() {engine := html.NewFileSystem(http.FS(tmpl), ".tmpl")app := fiber.New(fiber.Config{Views: engine})app.Get("/", func(ctx *fiber.Ctx) error {return ctx.Render("templates/index", fiber.Map{"title": "Golang Embed 测试"})})app.Listen(":3000")
}

通过html.NewFileSystem函数加载embed,然后把它当做视图渲染器,传给fiber.New即可,现在运行这个段代码,访问http://127.0.0.1:3000就可以看到模板渲染后的效果了。

小结

通过以上介绍,相信你肯定熟练的掌握了在各个框架中如何使用embed的了,其实我们可以总结下,会发现这个http.FS函数用的最多,因为它是一个把embed.FS转为http.FileSystem的工具函数,这样就可以在各个Web框架中直接使用。

精彩推荐

Go爬虫+WordPress每月躺赚上千元(合法合规实战)

果然,比特币到了5万美金后,炒币机器人也出现了

日历+石墨做团队管理

十年经验谈:超过90%人的方法

本文为原创文章,转载注明出处,欢迎扫码关注公众号flysnow_org或者网站http://www.flysnow.org/,第一时间看后续精彩文章。觉得好的话,顺手分享到朋友圈吧,感谢支持。

扫码关注

分享、点赞、在看就是最大的支持

Go 语言 | 1.16 新增的embed在各流行Web框架中的应用相关推荐

  1. go语言 echo框架_如何在Go Echo Web框架中设置嵌套HTML模板

    go语言 echo框架 by Ying Kit Yuen 英杰苑 如何在Go Echo Web框架中设置嵌套HTML模板 (How to setup a nested HTML template in ...

  2. php风格goweb框架,go语言 web框架比较

    随着go语言在16年的爆发,各种开源web框架开始如雨后春笋一般的涌出,比较出名有beego,Martini,gin ,Macaron,Traffic,Revel, Goji等.本文笔者总结下目前go ...

  3. Go语言(Golang)的Web框架比较:gin VS echo

    Go语言(Golang)的web框架比较之:gin vs echo 由 butaixianran 在 2016-01-23 22:00 发布 35423 次点击 原文发在:https://771dia ...

  4. [转]Go语言(Golang)的Web框架比较:gin VS echo

    Go语言(Golang)的web框架比较之:gin vs echo 由 butaixianran 在 2016-01-23 22:00 发布 35423 次点击 原文发在:https://771dia ...

  5. c语言ffffff错误,C语言打印16进制出现0xffffff现象的问题剖析!

    C语言打印16进制出现0xffffff现象的问题剖析! 其实类似的问题不是只在网络程序中才会出现的,看示例代码: 复制代码 1 #include 2 int main() 3 { 4     char ...

  6. 16 16点阵c语言程序,用C语言编程16点阵字库

    用C语言编程16点阵字库 2007-07-31 12:28 #include #include #include #include #include #include #include #define ...

  7. 用C语言将16个数存放到40H中,2012年微型计算机原理与接口技术自考题模拟(1)...

    2012年微型计算机原理与接口技术自考题模拟(1):2012年微型计算机原理与接口技术自考题模拟.本试卷总分100分:共有10类型题目 一.单项选择题 ,每小题1分,共16分,在每小题列出的四个备选项 ...

  8. 【springmvc+mybatis项目实战】杰信商贸-16.新增从表货物信息

    通过上几次我们已经将购销合同的所有业务完成了,接下来我们要完成的是在购销合同下的货物的业务 我们的购销合同相对于货物是一对多的,所以我们需要配置对象之间的关联关系. 首先先编写实体类ContractP ...

  9. Go实战--也许最快的Go语言Web框架kataras/iris初识二(TOML、Cache、Cookie)

    生命不止,继续 go go go!!! 昨天介绍了iris框架,介绍了如何使用basic认证.Markdown.YAML.Json等:  Go实战–也许最快的Go语言Web框架kataras/iris ...

最新文章

  1. pyhton re模块
  2. 涨跌因子计算器下载哪里下载_网易超级计算器appv1-网易超级计算器v1下载
  3. 【java基础】POJO和JavaBean的区别
  4. 单例模式 -- Java
  5. 从传递函数到差分方程的转换
  6. CCNA--点对点协议(PPP)
  7. 危机永远回来,只是什么时候的问题
  8. 南方日报专访 | 网易云信沈青松: 企业上云正热,PaaS将迎来爆发
  9. boost::movelib::unique_ptr相关的测试程序
  10. 调用异步服务时的超时处理
  11. 网络编程-网络分层的意义
  12. qt5 窗体显示完毕信号_iPhone手机信号不好?试试这样设置,随时随地让你的手机信号满格...
  13. 洛谷P2181 对角线(组合数)
  14. Python风格总结:模块调用
  15. Mysql 省市区字典(带层级,带经纬度,带拼音)
  16. 服务器日志显示意外关闭,服务器多次异常关闭,错误日志:计算机已经从检测错误后重新启动。。检测错误: - Microsoft Community...
  17. 解决:No routes matched location “/“
  18. 双非计算机硕士何去何从(1)
  19. 看代码解读CenterNet :Objects as Points
  20. 一站式:虚拟机安装Linux系统(CentOS_7),多节点Linux环境打造,XShell的使用

热门文章

  1. 第一次搭建成功MySQL数据库
  2. 我要改变世界改变自己
  3. 使用iconv编程进行字符集转换
  4. spring boot 与 iview 前后端分离架构之开发环境基于docker的部署的实现(三十六)
  5. Web前端大作业、简单的学生网页作业源码 基于html css javascript响应式个人相册博客网站
  6. 365资讯简报 每日精选12条新闻早报 每天一分钟 知晓天下事
  7. web前端工程师在移动互联网时代里的地位问题
  8. 什么是云服务,云终端,云计算?
  9. 收藏网上的一个搞笑语录贴
  10. 阿里云盘电脑版官方中文版V2.1.7.650 | 阿里云网盘电脑版下载