Go Web 应用程序的目录结构

2024-01-08

我已经按照编写网络应用程序 https://golang.org/doc/articles/wiki/Go 网站上的教程,我开始编写自己的网络应用程序。我也读过开头如何编写 Go 代码 https://golang.org/doc/code.html并尝试使用相同的工作区结构来组织我的代码。

我正在编写一个名为 mygosite 的简单 Web 应用程序,它通过呈现单个模板来处理所有请求。运行后go install github.com/wesleym/mygosite,我的目录结构现在如下所示:

go
+-src
| +-github.com
|   +-wesleym
|     +-mygosite
|       +-mygosite.go
|       +-templates
|         +- index.html
|       +-.git
+-bin
  +-mygosite

在我的代码中,我指的是带有路径的模板templates/index.html。当我跑步时bin/mygosite,应用程序找不到我的模板,因为它位于源树中。由于模板对我的应用程序很重要,因此我不想将它们移到 mygosite git 存储库之外。

考虑到我想要做的事情,我的目录布局合理吗?我应该将代码中的模板路径更改为src/github.com/wesleym/mygosite/templates/index.html? CSS 和 JavaScript 等静态资源怎么样?当需要引入它们时,它们应该放在哪里?

tl;dr:在 Go Web 应用程序项目中,我应该将模板和静态文件放在哪里?


2021 年更新,其中Go 1.16 https://tip.golang.org/doc/go1.16#library-embed,你会使用:

The new embed package https://tip.golang.org/pkg/embed/使用新的编译过程中提供对嵌入程序中的文件的访问//go:embed指示。

See "使用“embed”包在 Go 中嵌入文件 https://echorand.me/posts/go-embed/", from 阿米特·萨哈 https://twitter.com/echorand(@Atlassian 的 SRE)确实在他的项目中嵌入了一个模板。

//go:embed templates/main.go.tmpl
var tmplMainGo []byte

这使得上述模板的内容可以作为字节片使用tmplMainGo多变的。

然后我们可以按如下方式访问该模板:

tmpl, err := tmpl.Parse(string(tmplMainGo))

请参阅演示:amitsaha/go-embed https://github.com/amitsaha/go-embed.

也可以看看 ”在 Go 1.16 版本中使用 Embed https://lakefs.io/working-with-embed-in-go/" from 巴拉克·阿马尔 https://twitter.com/nopcoder和他自己的演示项目 https://github.com/treeverse/blogs/tree/master/mypostcard.


原回答2014:你可以考虑使用该项目jteeuwen/go-bindata https://github.com/jteeuwen/go-bindata(存档于2018年)

该包将任何文件转换为可管理的 Go 源代码。对于将二进制数据嵌入到 go 程序中很有用。文件数据在转换为原始字节切片之前可以选择进行 gzip 压缩。

你可以看到它用在“golang嵌入文件供后续解析执行使用 https://stackoverflow.com/a/12483181/6309"

同一页面还提到GeertJohan/go.rice https://github.com/GeertJohan/go.rice作为备选

最近另一个好工具来自esc:在 Go 中嵌入静态资源 http://mattjibson.com/blog/2014/11/19/esc-embedding-static-assets/

一个程序:

  • 可以获取一些目录并以与 http.FileSystem 兼容的方式递归地将所有文件嵌入其中
  • 可以选择禁用本地文件系统以进行本地开发
  • 不会在后续运行中更改输出文件
  • 文件更改时具有合理大小的差异
  • 适合供应商
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Go Web 应用程序的目录结构 的相关文章

  • 如何在中间人的部分内容中渲染部分内容

    我有一些 Haml 部分 其中许多包含样板 container row col lg 12 当我尝试将其抽象出来时 partial site section I get syntax error unexpected keyword end
  • 网站性能衡量

    我需要一个免费的工具来测量网站的性能 并且不需要对代码 jsp asp 页面 进行任何更改 感谢所有帮助 对于绩效衡量 我建议您YSlow http developer yahoo com yslow 它是一个 Firefox 插件 集成了
  • 将具有联合字段的 C 结构映射到 Go 结构

    我从 Go 中的某些 WinApi 的系统调用中获取结果 我可以轻松地从 C 代码映射简单的结构 但是如何处理如下所示的 C 结构 typedef struct SPC LINK DWORD dwLinkChoice define SPC
  • Maven - 在构建时包含不同的文件

    我有十个 WAR 文件 所有这些文件都有几乎相同的代码和标记 唯一的区别在于图像 CSS 和消息 我偶然发现了配置文件的概念 但我还没有完全理解它 我不确定这是否可以处理我需要它做的事情 基本上 我想要一个针对 10 个不同 WAR 具有不
  • 如何为高流量网络应用程序实现“保存搜索”功能?

    我想知道可以在 eBay 等大型网络应用程序上找到的 保存的搜索 功能 您可以做的就是保存搜索 例如 宾得镜头 50mm 1 4 每当有人出售符合搜索条件的新优质标准快速宾得镜头时 您都会收到通知 对我来说 实现此类功能并不是一件简单的事情
  • 企业 Web 应用程序中的 JavaFX - 经典网页的良好替代方案?

    我们为不同的客户开发了多种 Web 应用程序 从为那些可怜的管理员提供的简单 看起来很无聊的 CRUD 风格的 GUI 到为那些互联网用户提供的奇特的 AJAX 增强型 GUI 所有这些都基于 JSF 1 2 与 JBoss Seam 2
  • 根据给定的索引集获取参数包的子集

    好吧 这确实是一件困难的事情 我希望能够通过在给定的一组有效索引处选择参数类型来获取参数包的子集 然后使用该参数包作为函数的参数列表 IE template
  • 无逻辑模板(例如胡子)有什么优点?

    最近 我遇到了mustache http mustache github com 据称是无逻辑模板 然而 没有解释为什么它是以无逻辑的方式设计的 换句话说 无逻辑模板的优点是什么 换句话说 它可以防止你搬起石头砸自己的脚 在过去的 JSP
  • 可变参数模板的模板模板参数扩展

    我最近了解到模板模板参数的存在 现在想知道是否可以这样做 template
  • foo.Name undefined(类型接口{}没有字段或方法名称)

    我使用本机 golang 包 container list 来管理堆栈中的 inotify 事件 当我访问堆栈的项目时 我的类型失败 我认为 import golang org x exp inotify container list lo
  • 带 cookie 身份验证的 Gorilla websocket

    这是我的设置 我正在构建一个带有用户登录的服务 使用 Negroni 和 Gorilla 登录后 用户会获得一个会话 cookie 服务器使用该会话 cookie 来授权受保护的端点 受保护的端点之一允许用户 客户端与服务器打开 Webso
  • 将绝对路径和相对路径组合起来得到新的绝对路径

    我正在编写一个程序 其中一个组件必须能够采用给定的路径 例如 help index html or help 和基于该位置的相对路径 例如 otherpage index html or sub dir of help or help2 h
  • 在 Go 中修改导入的库

    我的问题 弹性节拍 https www elastic co products beats是一个用 Go 编写的日志传送程序的开源项目 它具有多种日志输出功能 包括控制台 Elasticsearch 和 Redis 我想将我自己的输出添加到
  • 在 Codeigniter 中加载 javascript

    对于我们的 Code Igniter 应用程序 我们在结束 body 标记之前加载所有 javascript 所以在我们的控制器中我们有 this gt load gt view head this gt head this gt load
  • 如果变量的值在编译时已知/未知,则进行专门化

    如何在编译时 在实际编译和运行程序之前 其参数之一的值已知 未知的情况下专门化模板函数 我还不知道怎么办 idea 1 include
  • 如何使用golang中通过引用传递的索引访问切片中的元素

    我将切片的引用传递给函数 并且我正在函数内的切片中进行更改 我还尝试使用索引访问切片中的元素 它在 golang 中抛出异常 通过引用传递的索引访问切片中的元素的最佳方法是什么 您可以在此处找到示例代码 参考 http www reddit
  • 如何从办公文档迁移到基于现代网络技术的文档 - 欢迎建议

    目前 所有文档均基于 MS Office 如果您想集成某些功能 这将变得非常具有挑战性 然后您可以选择使用 VBA 或 VSTO 第一个不太舒服 第二个可能就像拿大锤敲碎坚果一样 简单的控件 隐藏文本或基本数学等简单的事情都可以通过 HTM
  • Go 中的切片分块

    我有一个切片 其中包含约 210 万条日志字符串 我想创建一个切片切片 其中字符串尽可能均匀分布 这是我到目前为止所拥有的 logs is a slice with 2 1 million strings in it var divided
  • 单击链接时启动本地应用程序

    我正在开发一个内部 Web 应用程序 它允许我为客户存储远程控制凭据 每次我想要连接到客户计算机时 我都需要启动远程支持软件 复制并粘贴用户名和密码 然后单击 开始 按钮 该软件将具有可用的命令行参数 允许我立即启动会话 但是 我不知道如何
  • 使用 google.protobuf.Timestamp 在 Go 中解析带有时区偏移的日期时间戳

    我正在创建一个将使用 GRPC 和 protobuf 的 Go 应用程序 我的 RPC 服务应获取包含类型的消息google protobuf Timestamp 解析它并最终将其保存在数据库中或对其执行更多操作 我对什么被认为是该类型的有

随机推荐

  • 添加自定义刻度和标签

    我想在 matplotlib 中添加自定义主要刻度和标签 典型用途是在该位置添加标签math pi与标签 pi 我的目标是让其他刻度保持原样 我想保留原始的主要和次要刻度以及之前选择的格式 但带有这个额外的刻度和标签 我已经找到了一种方法
  • 使用 1:n 中的唯一值创建 n × n 矩阵

    我想在 R 中生成一个随机的 n n 矩阵 离散值范围从 1 到 n 棘手的部分是我希望每个值在行和列中都是唯一的 例如 如果n 3矩阵可能如下所示 1 2 3 2 3 1 3 1 2 或者它可能看起来像这样 2 3 1 1 2 3 3 1
  • 我的 git 存储库中的所有这些隐藏('._' 前缀)文件是什么?

    当我在目录上执行 git status 时 它会显示一堆未跟踪的文件 这些文件似乎是重复的 唯一的区别是它们都有一个前缀 例如 我需要添加的未跟踪文件之一是 app assets stylesheets categories css另一个文
  • 如何在 angular2 中显示/隐藏 div 的动态 id

    这里执行了 kpiName 的循环 并且也执行了 subRegion 的内部循环 结果 4 divclass col xs 2 创建并在其中创建两个 div 过滤器类内的可点击 div 其动态 ID 为id filteredTabSubRe
  • 如何从 Pyspark 中的日期列中减去天数列?

    给定以下 PySpark DataFrame df sqlContext createDataFrame 2015 01 15 10 2015 02 15 5 date col days col 如何从日期列中减去天数列 在此示例中 结果列
  • Java 中的 Ruby 解析器

    我正在做的项目是用 Java 和解析器源代码文件编写的 到目前为止的 Java src 现在我也想启用解析 Ruby 代码 因此 我正在寻找一个可以解析 Ruby 源代码的 Java 解析器 到目前为止我唯一能找到的是 Ruby 中的 Ru
  • 从批处理文件运行 python 脚本时出现 ModuleNotFoundError

    我有一个简单的 python 脚本 名为sc py翻译一个词 这是我的代码 python3 from googletrans import Translator import sys translator Translator dest h
  • Excel VBA 创建文件夹、子文件夹和更多子文件夹

    我有一个问题与我在这里看到的其他一些问题非常相似 但它们并没有完全回答我需要的问题 或者当我尝试它们时 它导致了一个我不知道如何解决的错误 只有5级我无法发表评论来提问 在 Excel 中 我有一个用于引用文件夹的命名配置文件的文件 我尝试
  • kerascompute_output_shape不适用于自定义层

    我自定义了一个层 将batch size和第一个维度合并 其他维度不变 但是compute output shape好像没有效果 导致后面的层无法得到准确的形状信息 从而产生错误 如何使compute output shape工作 impo
  • C++ 函数返回字符串数组

    我是 C 新手 对于一个学校项目 我需要创建一个能够返回字符串数组的函数 目前我的标题中有这个 Config h string getVehicles void 配置文件 string Config getVehicles string t
  • docker-compose:删除容器名称的默认后缀?

    my yml version 3 services myservice image myimage 当我跑步时docker compose p myprefix f my yml up 它创建名为myprefix myservice 1 是
  • 如何在没有数据库锁的情况下并行执行线程并在sqlite数据库中插入相应的数据?

    我需要调用多个 api 每个 api 在单独的线程中执行 并将响应中的相应数据插入到 sqlite 数据库中 而不会导致锁定 任何人都可以在这方面帮助我提供一个我可以参考的工作示例 我需要调用多个 api 每个 api 在单独的线程中执行
  • 我应该在哪里存储外键?

    如果我在两个表之间存在关系 两个表都有自己的主键 那么什么应该指导我决定哪个表应该存储外键 我知道关系的性质可能很重要 一对一 一对多 多对多 单向 双向 并且访问模式可能也很重要 那么做出这个决定的系统方法是什么 关系中的子表是哪个表 回
  • 微服务架构松散耦合的复杂性

    我对整个微服务潮流相当陌生 我一直在研究良好的微服务环境背后的架构和原理 定义微服务的主要内容之一应该是每个服务的松散耦合性质 微服务A永远不应该打电话微服务B直接 或者您正在有效地创建一个整体系统 该系统失去了架构模式提供的可扩展性 问题
  • 如何获取由 vector::reserve() 分配的缓冲区的地址?

    我有一个 std vector 值 我知道其最大大小 但实际大小在使用过程中会有所不同 void setupBuffer const size t maxSize myVector reserve maxSize void addToBuf
  • 通过 hibernate 或连接池保证请求

    使用连接池的休眠是否需要重试来处理间歇性故障 例如网络问题 我的同事认为这不是使用连接池的必然原因 如果连接出现任何问题 那么连接池管理器会处理它 我不相信 因为连接可能是开放且有效的 但是当发出请求时 它可能会屈服于网络问题 由于正在做的
  • 异步和等待 - 处理对同一方法的多次调用 - 相互锁定/等待?

    我有一个复杂的基于任务 锁的混乱来执行 长 数据操作 并且我正在尝试用异步 等待替换它 我是异步等待的新手 所以我担心我犯了一些大错误 为了简化事情 我的 UI 有几个页面依赖于相同的数据 现在 我只需要获取这些数据一次 所以我缓存它 进一
  • 对字典中成员“下标”的引用不明确

    我正在尝试为类创建一个可失败的初始化程序 我的类将使用网络请求的输入进行初始化 网络不可靠 我想创建一个初始化程序来检查所有属性是否存在 否则会失败 我试图在这里使用守卫 所以请随时指出该方法中任何明显的错误 public class Jo
  • 特殊字符问题:MQ 消息 PUT 错误:java.nio.charset.UnmappableCharacterException

    我有一个设置 其中有 JMS 生产者和 JMS 接收器 发送者应用程序发送如下消息 source text abcdefg JMS 接收器收到消息后 使用纯 IBM MQ API 类将其放入 IBM MQ 队列 将此消息发送到 MQ 时 我
  • Go Web 应用程序的目录结构

    我已经按照编写网络应用程序 https golang org doc articles wiki Go 网站上的教程 我开始编写自己的网络应用程序 我也读过开头如何编写 Go 代码 https golang org doc code htm