如何嵌入文件以供以后解析执行使用

2024-01-11

我本质上是想浏览一个 html 文件的文件夹。我想将它们嵌入到二进制文件中,并能够根据请求解析它们以用于模板执行目的。 (如果我措辞不当,请原谅)。

任何想法、提示、技巧或更好的方法来实现这一点都非常感谢。

// Template Files
type TempFiles struct {
    Files map[string]string
}

// Loop through view files and load them
func LoadTempFiles() {
    t := new(TempFiles)

    // Load template files
    filepath.Walk("application/views", func(path string, info os.FileInfo, err error) error {
    if !info.IsDir() {
        content, _ := ioutil.ReadFile(path)
        t.Files[path] = string(content)
    }
    return nil
    })
}

func ViewTemp(w http.ResponseWriter, path string) {
    t := new(TempFiles)

    temp, err := template.New().Parse(t.Files[path])
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
    } else {
        temp.Execute(w, nil)
    }
}

我对大多数 Go Web 应用程序都是这样做的。我用去绑定数据 https://github.com/go-bindata/go-bindata从我想要嵌入的所有文件自动生成 Go 源代码,然后将它们编译成二进制文件。 所有这些都是在构建过程中自动完成的。

一个缺点是当前的 go 构建工具没有提供一种挂钩构建过程的方法,因此我使用 Makefile 来实现此目的。当 makefile 被调用时,它运行go-bindata生成所有必要文件的源代码,然后通常会执行一些额外的代码生成操作(特别是,创建一个 Go 源文件,其中列出了地图中的所有嵌入文件。如果您愿意的话,可以创建一个目录)。然后它继续编译实际的程序。

这可能会变得有点混乱,但您只需将其全部设置一次。 另一个缺点是使用 Makefile 意味着该软件与go get命令。但由于我的大多数网络应用程序都不是为了共享,所以到目前为止这还不是问题。

在调试/开发此类应用程序时,嵌入静态 Web 内容会引发另一个问题:我不能只编辑 HTML 或 CSS 文件并刷新浏览器以查看其效果。我必须停止服务器,重建它并在每次编辑时重新启动它。这显然不理想,所以我将 Makefile 拆分为debug and release模式。发布模式执行我上面描述的操作。然而,调试模式实际上不会嵌入静态文件。它确实为每个文件生成源文件,但它不包含实际的文件数据,而是包含一个仅从文件系统加载数据的存根。

就服务器代码而言,生成的代码没有区别。它所做的只是调用一个函数来获取给定静态文件的内容。它不关心该内容是否实际嵌入到二进制文件中,或者是否从外部源加载。因此这两种构建模式可以自由互换。

例如,在发布和调试模式下获取静态文件内容的相同生成函数将如下所示:

发布方式:

func index_html() []byte {
    return []byte {
        ....
    }
}

调试模式:

func index_html() []byte {
   data, err := ioutil.ReadFile("index.html")
   ...
   return data
}

两种情况下的界​​面是相同的。这样可以轻松无忧地进行开发和调试。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何嵌入文件以供以后解析执行使用 的相关文章

  • 带有导出字段的私有类型

    在 Go 教程的第二天有这样的练习 为什么拥有带有导出字段的私有类型会很有用 例如 package geometry type point struct X Y int name string 请注意point是小写的 因此不会导出 而字段
  • 无法从另一个标签的源代码构建和安装 go

    我正在尝试使用此从源代码构建和安装 go文档 https go dev doc install source 当我喜欢以下内容时 这效果很好 git clone https go googlesource com go goroot cd
  • 在 Go 中,如何将函数的 stdout 捕获到字符串中?

    例如 在 Python 中 我可以执行以下操作 realout sys stdout sys stdout StringIO StringIO some function prints to stdout get captured in t
  • 无法将字符串解组为 int64 类型的 Go 值

    我有结构 type tySurvey struct Id int64 json id omitempty Name string json name omitempty I do json Marshal在 HTML 页面中写入 JSON
  • 如何使用 go web 服务器提供静态 html 文件?

    如何使用 go web 服务器提供 index html 或其他静态 HTML 文件 我只想要一个基本的静态 HTML 文件 例如一篇文章 我可以从 Go Web 服务器提供该文件 HTML 应该可以在 go 程序之外进行修改 就像使用 H
  • Go 编程 - 使用指针绕过访问权限

    假设我的项目有以下层次结构 fragment fragment go main go 并且在fragment go我有以下代码 只有一个 getter 没有 setter package fragment type Fragment str
  • golang sql 驱动程序的准备语句

    关于golang的sql driver 下面两条语句有什么区别 store DB is sql DB type rows err store DB Query SQL args err nil defer rows Close and st
  • 如何自定义解析错误的 HTTP 400 响应?

    我编写了一个 REST API 服务 要求所有响应均为 JSON 但是 当 Go HTTP 请求解析器遇到错误时 它会返回 400 作为纯文本响应 而不会调用我的处理程序 例子 gt curl i H Authorization Basic
  • GoLang - 坚持使用 ISO-8859-1 字符集

    我正在开发一个项目 我们需要将信息保存在具有 ISO 8859 1 表的旧数据库中 因此 在向数据库写入内容之前 我需要将其从 UTF 8 转换为 ISO 8859 1 每次从数据库检索它时 我都需要将其转换回 UTF 8 我试图使用图书馆
  • go 中的属性更改通知

    如何在 go 中向多个接收器发出 属性 更改信号 类似于在 Qt 中使用通知信号定义属性的方式 例如 如果您想象有一些值需要以多种方式显示 例如进度值可以同时显示为进度条和文本 当基础值发生变化时 两者都需要更新 一种方法可能是利用chan
  • 无法理解 5.6.1。注意事项:捕获迭代变量

    我正在学习 Go 但无法理解 var rmdirs func for dir range tempDirs os MkdirAll dir 0755 rmdirs append rmdirs func os RemoveAll dir NO
  • Golang Appengine 项目无法构建

    我有一个使用 golang 的应用程序引擎项目 我已经大约一年没有碰过了 我现在无法让它在之前构建的机器上构建 我收到以下错误 go app builder 解析输入失败 解析器 src golang org x net internal
  • GO并发编程测试

    我试图确保我的并发程序不存在以下情况 僵局 livelock 饥饿 我找到了以下工具http blog golang org race detector http blog golang org race detector 我尝试编译并运行
  • 无法连接到代理“证书由未知机构签名”

    我正在尝试通过 Kubernetes 部署上的 cloudsql proxy 容器连接到 CloudSQL 实例 我已安装 cloudsql 凭据以及值GOOGLE APPLICATION CREDENTIALS set 但是 我的日志中仍
  • 视频第一帧

    我正在创建一个单页应用程序 后端使用 Golang 前端使用 javascript 我想找到一种使用 Golang 获取视频第一帧的方法 首先 我将 mp4 视频文件上传到服务器 它保存在服务器上 有没有办法使用 Golang 获取该视频的
  • Golang 基础知识 struct 和 new() 关键字

    我正在学习 golang 当我阅读描述结构的章节时 我遇到了初始化结构的不同方法 p1 passport var p2 passport p3 passport Photo make byte 0 0 Name Scott Surname
  • 我可以根据我正在构建的操作系统导入 Golang 包吗?

    假设我有一个基于哪个操作系统的 go 项目 在某些情况下是哪个发行版 我想使用 Systemd 客户端包 Upstart 客户端包 sysv 客户端包 launchd 客户端包 是否可以有选择地导入每个包 以便我只导入我正在构建的每个操作系
  • 在 Go 中使用电子邮件地址创建证书签名请求 (CSR)

    我尝试使用 crypto x509 包生成 CSR 但没有找到将 emailAddress 字段添加到其主题中的方法 根据文档证书申请 http golang org pkg crypto x509 CertificateRequest结构
  • Golang中如何删除字符串的最后一个字符?

    我想删除字符串的最后一个字符 但在此之前我想检查最后一个字符是否是 如何才能做到这一点 以下是删除尾随加号的几种方法 package main import fmt strings func TrimSuffix s suffix stri
  • 使用 OpenTelemetry 统一不同服务的范围

    我刚刚开始使用 OpenTelemetry 并为此创建了两个 微 服务 Standard and GeoMap 最终用户将请求发送到Standard服务 该服务又将请求发送到GeoMap在将结果返回给最终用户之前获取信息 我使用 gRPC

随机推荐

  • 使用 NVIDIA TensorRT 推理引擎运行 Tensorflow

    我想使用 NVIDIA TensorRT 来运行我的 Tensorflow 模型 目前 TensorRT 支持 Caffe prototxt 网络描述符文件 我无法找到将 Tensorflow 模型转换为 Caffe 模型的源代码 有什么解
  • 如何以编程方式关闭选择文件对话框

    我有一个输入字段type file选择图像文件 但我想要的是 如果有人打开文件选择器对话框 并且在某些特定事件中 它会自动 以编程方式关闭对话框 而无需用户点击取消按钮 有什么办法可以用js jquery来实现吗 互动
  • jquery 插件 Isotope 的回调

    我正在使用同位素 http isotope metafizzy co http isotope metafizzy co 具有可扩展的项目 我想使用 ScrollTo 以便我可以自动滚动到新扩展的项目 我首先尝试将回调与 reLayout
  • Spring @Value 无法识别 Interger 属性值

    我正在创建一个用于邮件服务配置的组件 gt gt Component PropertySource classpath mail properties public class Mail Value email config host pr
  • StackOverflow 中的 301 重定向。它是如何运作的? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我们以这个问题的网址为例 http stackoverflow com questions 20306229 301 redirect i
  • PHP - Laravel Collection 或 Array 的类型提示

    我想创建一个接受任何可遍历对象作为参数的函数 例如 Laravel Collection Array 有没有办法在函数参数中输入提示这个条件 我希望在单一定义中实现以下两个效果 function test array traversable
  • Visual Studio 2010:关于“程序数据库管理器”的致命错误 C1902

    这是MSDN上的一些描述 错误信息 程序数据库管理器不匹配 请检查您的安装 程序数据库文件 pdb 是使用比编译时发现的版本更新的 mspdb80 dll 创建的 此错误通常表明 mspdbsrv exe 或 mspdbcore dll m
  • 替换池中表现不佳的工人

    我有一组无国籍的演员 执行类似的任务 这些工人中的每一个都是不可靠的并且可能表现不佳 在我的设计中 我可以轻松地产生更多演员来取代懒惰的演员 演员的演技是靠自己来评价的 有没有办法让主管 演员池进行此评估 以帮助决定哪些工作人员速度慢到足以
  • 无法从临时历史表中删除行

    我最近发现了 SQL Server 中的时态表 我想开始使用这个功能 然而 最大的障碍是无法从中删除记录 由于 GDPR 合规性 这是绝对必须的 从历史表中删除记录显然会导致错误 无法从临时历史表中删除行 因此 为了能够从历史表中删除记录
  • 原则问题:无法获取最后插入标识符

    当我尝试将数据保存到我的模型时 Doctrine 抛出此异常 Message Couldn t get last insert identifier 我的表设置代码是 this gt hasColumn id integer 4 array
  • Typescript 类型转换对象因此特定的必需键在类型中不再是可选的?

    假设你有一个对象类型 type Person name string color string address string 但是 您想将该类型更改为以下类型 您知道名称和颜色将存在 type Person name string colo
  • ASP.NET MVC 中部分视图的正确位置是什么?

    有人会确认 ASP NET MVC 中部分视图的最佳位置吗 我的想法是 如果这是一个将在许多地方使用的全球视图 那么就可以共享 如果它是视图的一部分 并被包装到部分视图中以使代码阅读更容易 那么它应该进入 Views Controller
  • 理解从先序遍历构造树的伪代码

    我需要做一些类似于这个问题中描述的任务 根据给定的前序遍历构造树 https stackoverflow com questions 4908545 construct tree with pre order traversal given
  • 如何使用 WebGL 和 GLSL 在 J/s 文件中运行 Shadertoy 中的着色器?

    我是着色器编程新手 我想使用 WebGL 和 GLSL 创建一个着色器 为了了解它的实际工作原理 我想测试 Shadertoy 的着色器 但是如何从 Shadertoy 获取代码并实际在 J S 文件中运行它呢 您是否只需将 Shadert
  • 以编程方式从“p”和“q”生成“d”(RSA)

    我有两个号码 p and q 我知道我能得到phi p 1 q 1 然后ed 1 mod phi 但我不确定我明白这意味着什么 我写了一些Python p NUM q NUM e NUM phi p 1 q 1 d 1 phi float
  • 回显所有 json_encoded 行

    我正在尝试循环访问数据库并输出与连接表匹配的所有行 我有以下两个表 任务项目存储与项目相关的所有数据 加入任务项存储玩家 ID 和玩家拥有的物品之间的关联 JS 传入查询表所需的所有信息 getJSON phpscripts php pla
  • 尝试使用 Protocol Buffers - Google 的数据交换格式时,goog 未定义错误

    我正在尝试使用 Protocol Buffers Google 的数据交换格式https github com google protobuf tree master js https github com google protobuf
  • plpgsql For循环中的Select语句创建多个CSV文件

    我想重复以下查询 8760 次 将一年中每个小时的 2 替换为 1 到 8760 我们的想法是每小时创建一个单独的 CSV 文件以进行进一步处理 COPY SELECT FROM public completedsolarirad2012
  • ZF2 toRoute 与 https

    我们正在使用 Zend Framework 2 并使用toRoute在我们的控制器中重定向到不同的位置 例如 this gt redirect gt toRoute home 无论如何 是否可以使用此方法或替代方法将其重定向到 https
  • 如何嵌入文件以供以后解析执行使用

    我本质上是想浏览一个 html 文件的文件夹 我想将它们嵌入到二进制文件中 并能够根据请求解析它们以用于模板执行目的 如果我措辞不当 请原谅 任何想法 提示 技巧或更好的方法来实现这一点都非常感谢 Template Files type T