Golang Gin embed static静态文件嵌入问题

 更新时间:2026年06月23日 10:06:30   作者:LeoForBest  
在使用Gin框架开发Web服务时,需解决静态资源嵌入问题,本文探讨了将static目录嵌入到Gin生成的应用程序中,通过直接使用Gin自带的http.FileServer方法,简化了开发流程,最终实现了一键部署的目标

需求

Gin开发Web服务时, 编译生成的应用可能如下, 需提供static目录和web-app.exe给用户

如果将static文件夹到生成的exe中,分发单个EXE文件给用户使用,更加方便

# 改进前
├── static
│   └── js/jquery.min.js
│   ├── favicon.ico
│   ├── index.html
├── web-app.exe
# 改进后
├── web-app.exe (static内嵌进exe里)

改进思路

a). Gin文档 静态资源嵌入 方案

参考: https://learnku.com/docs/gin-gonic/1.7/examples-bind-single-binary-with-template/11403

需要使用额外工具go-assets,操作有点复杂,因此不考虑

b). Gin 自带方法

代码:

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

效果:

favicon.ico为例, 需要访问

http://localhost/static/static/favicon.ico

中间多了两个static, 而index.html中可能资源位置是

<link rel="icon" href="/static/favicon.ico" rel="external nofollow" >

c). 改进

1. 自带http库做法

http.StripPrefix("/static", http.FileServer(http.FS(fs)))

2. 查看gin staticfs源码

看下大致调用函数名,可以看到大概是这样调用

http.FileServer(fs).ServeHTTP(c.Writer, c.Request)

func (group *RouterGroup) createStaticHandler(relativePath string, fs http.FileSystem) HandlerFunc {
	absolutePath := group.calculateAbsolutePath(relativePath)
	fileServer := http.StripPrefix(absolutePath, http.FileServer(fs))
	return func(c *Context) {
		........ 读取fs中文件,判断是否存在有权限等错误,省略
		fileServer.ServeHTTP(c.Writer, c.Request)
	}
}

3. 最终解决方案

package main
import (
	"embed"
	"net/http"
	"github.com/gin-gonic/gin"
)
//go:embed static/*
var fs embed.FS
func main() {
	r := gin.Default()
/*
查看staticfs方案中gin启动日志可以看到,staticfs实际注册了GET、HEAD
[GIN-debug] GET    /static/*filepath         --> github.com/gin-gonic/gin.(*RouterGroup).createStaticHandler.func1 (3 handlers)
[GIN-debug] HEAD   /static/*filepath         --> github.com/gin-gonic/gin.(*RouterGroup).createStaticHandler.func1 (3 handlers)
因此直接用r.Any
*/
	r.Any("/static/*filepath", func(c *gin.Context) {
		staticServer := http.FileServer(http.FS(fs))
		staticServer.ServeHTTP(c.Writer, c.Request)
	})
	r.Run("localhost:80")
}

查看效果达到预期

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 让Go反射变快的方法实例探究

    让Go反射变快的方法实例探究

    反射允许你在运行时获得有关 Go 类型的信息,如果你曾经愚蠢地尝试编写 json.Unmarshal 之类的新版本,本文将探讨的就是如何使用反射来填充结构体值
    2024-01-01
  • 深入探讨Go语言中的预防性接口为什么是不必要的

    深入探讨Go语言中的预防性接口为什么是不必要的

    在Go语言中,有一种从其他语言带来的常见模式:预防性接口,虽然这种模式在 Java 等语言中很有价值,但在Go中往往会成为反模式,本文我们就来深入探讨一下原因
    2025-01-01
  • Go Web下gin框架的模板渲染的实现

    Go Web下gin框架的模板渲染的实现

    Gin框架是目前非常流行的Go语言Web框架之一,作为一个轻量级的框架,Gin提供了丰富的功能和灵活的架构,本文就来介绍下Go Web下gin框架的模板渲染的实现,感兴趣的可以了解一下
    2023-10-10
  • Go 如何基于IP限制HTTP访问频率的方法实现

    Go 如何基于IP限制HTTP访问频率的方法实现

    这篇文章主要介绍了Go 如何基于IP限制HTTP访问频率的方法实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-11-11
  • golang slice中常见性能优化手段总结

    golang slice中常见性能优化手段总结

    这篇文章主要为大家详细一些Golang开发中常用的slice关联的性能优化手段,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-10-10
  • Go方法接收者值接收者与指针接收者详解

    Go方法接收者值接收者与指针接收者详解

    这篇文章主要为大家介绍了Go方法接收者值接收者与指针接收者详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • Golang中使用errors返回调用堆栈信息

    Golang中使用errors返回调用堆栈信息

    这篇文章给大家介绍了Golang中如何使用errors返回调用堆栈信息,文章通过代码示例给大家介绍的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2023-12-12
  • golan参数校验Validator

    golan参数校验Validator

    这篇文章主要介绍了golan参数校验Validator,validator包可以通过反射结构体struct的tag进行参数校验,下面来看看文章的详细介绍吧,需要的朋友也可以参考一下
    2021-12-12
  • 详解Golang如何优雅接入多个远程配置中心

    详解Golang如何优雅接入多个远程配置中心

    这篇文章主要为大家为大家介绍了Golang如何优雅接入多个远程配置中心详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • 利用Go语言实现流量回放工具的示例代码

    利用Go语言实现流量回放工具的示例代码

    今天给大家推荐一款使用Go语言编写的流量回放工具 -- goreplay;工作中你一定遇到过需要在服务器上抓包的场景,有了这个工具就可以助你一臂之力,废话不多,我们接下来来看一看这个工具
    2022-09-09

最新评论