在 Go 模板范围循环中,循环外部声明的变量是否会在每次迭代时重置?

2024-01-07

我正在尝试使用在 Go 模板范围循环之外声明的变量来查看上一篇文章是否与当前文章发生在同一天。这是一个简化的示例。

Where .Posts是一个 post 结构数组,每个结构都有一个.Content and a .Date.

{{ $prevDate := "" }}
{{ range $post := .Posts }}
    {{ if ne $prevDate $post.Date }}
        <div class="post-date">Posts dated: {{ $post.Date }}</div>
    {{ end }}
    <div class="post-content">{{ $post.Content }}</div>
    {{ $prevDate := $post.Date }}
{{ end }}

问题是$prevDate似乎被重置为""在循环的每次迭代开始时。

谁能帮助我理解为什么它的价值$prevDate在每次迭代时都会重置,也许会建议一种方法来完成我在这里尝试做的事情?


Note: Go 1.11 将支持通过赋值修改模板变量 https://tip.golang.org/doc/go1.11#text/template。这将是有效的代码:

{{ $v := "init" }}
{{ if true }}
  {{ $v = "changed" }}
{{ end }}
v: {{ $v }} {{/* "changed" */}}

Go 1.11 之前的原始答案如下:


变量不会重置。基本上发生的事情是你重新声明$prevDate循环内的变量。但它仅在重新声明之后和结束之前的范围内{{end}}的标签{{range}}。因此,当循环的下一次迭代到来时,您只能看到未更改的“外部”变量(因为您创建了一个新变量)。

您无法更改您创建的模板变量的值。

例如,您可以使用以下命令range form:

{{ range $index, $post := .Posts }}

And...

解决方案#1:使用注册函数

您可以为模板注册一个函数(请参阅template.Funcs() http://golang.org/pkg/text/template/#Template.Funcs)您可以将$index它将返回前一个元素的日期字段(位于$index -1).

它看起来像这样:

func PrevDate(i int) string {
    if i == 0 {
        return ""
    }
    return posts[i-1].Date
}

// Registering it:
var yourTempl = template.Must(template.New("").
    Funcs(map[string]interface{}{"PrevDate": PrevDate}).
    Parse(yourStringTemplate))

从你的模板中你可以这样称呼它:

{{range $index, $post := .Posts}}
    {{$prevDate := PrevDate $index}}
{{end}}

解决方案#2:使用帖子方法

这个解决方案是模拟的,但更简单:向您的Posts你可以直接调用它。无需注册函数。

例如:

type Post struct {
    // Your Post type
    Date string
}

type Posts []Post

func (p *Posts) PrevDate(i int) string {
    if i == 0 {
        return ""
    }
    return (*p)[i-1].Date
}

从你的模板中你可以这样称呼它:

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

在 Go 模板范围循环中,循环外部声明的变量是否会在每次迭代时重置? 的相关文章

  • 这两种方式哪一种是惯用的方式? time.Sleep() 还是自动收报机?

    我必须每分钟执行一些语句 我不确定我应该遵循以下哪一项 如果有人能解释内存和 CPU 方面的优缺点 那就太好了 时间 Sleep func main go func for time Sleep time Minute fmt Printl
  • 如何在golang中创建一个充满“000000...”数据的10MB文件?

    我打算在日志或磁盘队列等系统中使用 fdatasync 首先是在 ext4 等文件系统中创建一个带有 000000 的 10MB 文件 但我不知道如何正确地做到这一点 jnml fsc r630 src tmp SO 16797380 ls
  • 正确的文件扩展名或缩写是什么。 golang 的文本/模板?

    我正在考虑为其创建语法荧光笔 但我不知道这种特定类型模板的常规缩写 In 例子之一 http golang org pkg text template example Template helpers从文本 模板 godoc 中 它们引用
  • 如何使信号量超时

    Go 中的信号量是通过通道来实现的 一个例子是这样的 https sites google com site gopatterns concurrency semaphores https sites google com site gop
  • “go.tools”的权限被拒绝错误

    当我尝试安装 go 工具时 我的权限被拒绝 usr local go pkg tool linux amd64 cover 我可以接受 因为它是 usr local 目录及需求root使用权 但我的第一个疑问是为什么当我设置时它试图安装在这
  • 如何修复“缺少表的 FROM 子句条目”错误

    我正在尝试根据游戏 ID 获取平台名称 我有如下三个表 我正在尝试加入它们以获得所需的结果 Games Id 1 2 3 4 Game Platforms Id game id platform id 1 1 1 2 1 2 3 3 3
  • 为什么 gmail API 以纯文本形式发送 html 电子邮件?

    我正在尝试使用 gmail API 发送 html 电子邮件 但由于某些原因 它会随机以纯文本 文本形式发送电子邮件 谷歌似乎改变了我设置的内容类型标头 这有什么理由吗 电子邮件内容始终完全相同 正如我测试的那样 API 仍处于实验阶段吗
  • 在 Go to 函数中通过引用和值传递

    我对 Go 中通过引用和值传递有点困惑 我已经看到过对类型前面的 的解释 在类型名称前面 表示声明的变量将存储该类型的另一个变量的地址 而不是该类型的值 类型 这对我来说毫无意义 在Java中 如果我将数据库实例传递给函数 我会这样做 da
  • 是否可以在 C/C++ 中模仿 Go 接口?

    在 Go 中 如果类型具有接口定义的所有方法 则可以将其分配给该接口变量 而无需显式继承它 是否可以在 C C 中模仿此功能 是的 您可以使用纯抽象类 并使用模板类来包装 实现 抽象类的类型 以便它们扩展抽象类 这是一个简单的示例 incl
  • 解压文件的简单方法

    有没有一种简单的方法可以用 Go 解压文件 现在我的代码是 func Unzip src dest string error r err zip OpenReader src if err nil return err defer r Cl
  • golang无法启动调试,显示未找到框架CoreFoundation

    我使用的是 Macbook pro m1 在数据迁移或更新到 monterey 后 不确定是什么原因导致的 golang 似乎无法调试或 go list 编译 我尝试重新安装 更新 golang 结果是一样的 Go版本 1 17 3 dar
  • 如何将所有GET请求查询参数放入Go中的结构体中?

    你好 我想将 get 查询参数转换为 Go 中的结构 例如我有这样的结构 type Filter struct Offset int64 json offset Limit int64 json limit SortBy string js
  • 在复杂的文件夹结构中进行测试

    我正在 golang 中构建一个设计模式存储库 为了运行所有测试 我使用这个 bash 脚本 有用 bin bash go test creational abstract factory go go test creational bui
  • 单值上下文中的多值错误

    我在编译 GO 代码时遇到此错误 multiple value fmt Println in single value context 我正在尝试创建一个函数 该函数接受可变数量的整数并将每个变量打印在一行上 GO package main
  • 为什么 DER ASN.1 大整数的解组在 Golang 中仅限于 SEQUENCE?

    我希望能够使用encoding asn1 包从 DER 文件中解组一个大整数 但它看起来只适用于整数序列 例如 这不起作用 这很奇怪 因为 Big Int 的编组效果很好 https play golang org p Wkj0jAA6bp
  • 运行最新版本时没有“最新”消息?

    我正在尝试使用Sparkle https sparkle project org与 Qt Go 的绑定 https github com therecipe qt app 闪光 m import
  • 如何对结构切片而不是切片结构进行范围调整

    稍微玩了一下 Go HTML 模板后 我发现的所有循环模板中对象的示例都是将切片结构传递给模板 有点像这个示例 type UserList struct Id int Name string var templates template M
  • 如何使用 go1.6.2 构建 linux 32 位

    有没有任何组合GOARCH and GOOS我可以设置哪些值来构建 ELF 32 位二进制文 件 GOOS linux and GOARCH 386 更多示例 架构 32 bit gt GOARCH 386 64 bit gt GOARCH
  • 如何读取 UDP 连接直至超时?

    我需要读取 UDP 流量 直到超时 我可以通过在 UDPConn 上调用 SetDeadline 并循环直到出现 I O 超时错误来做到这一点 但这看起来很黑客 基于错误条件的流量控制 下面的代码片段看起来更正确 但并没有终止 在生产中 这
  • 如何通过在切片上查找来从切片复制到数组

    我正在编写一个库来处理二进制格式 我有一个带有数组变量的结构 我想保留它以用于文档目的 我还需要从输入字节片中查找和判断 一些伪代码 type foo struct boo 5 byte coo 3 byte func main input

随机推荐

  • 根据登录用户在运行时更改数据库架构

    我已经阅读了许多有关动态数据源路由的问题和答案 并使用以下方法实现了一个解决方案AbstractRoutingDataSource和另一个 见下文 这很好 但需要所有数据源的硬编码属性 随着使用该应用程序的用户数量的增加 这不再是合适的路由
  • 如何使用 VS2015 Preview 运行 xUnit 单元测试?

    我通过扩展管理器添加了 xUnit net runner for Visual Studio v0 99 8 但是当我打开 测试资源管理器 窗口时 它似乎没有拾取任何单元测试 此外 Resharper 9 EAP 是唯一支持 VS2015
  • R中将线性方程转换为矩阵形式的函数?

    我想知道 R 是否存在任何包或其他预构建的解决方案 能够将线性方程组转换为矩阵形式 例如 通过高斯赛德尔算法 https en wikipedia org wiki Gauss E2 80 93Seidel method 类似于equati
  • 如何将@mixin从一个sass文件包含到不同文件夹中的另一个sass文件

    我将一个 SASS 文件中的 mixin 包含到另一个文件中 但 ionic 出现错误serve命令 Error Sass Error Invalid CSS after include expected identifier was th
  • 找到给定图像的 Dockerfile

    我正在一台 Linux 机器上工作 我大约 3 4 周前构建了一个 Docker 镜像 但我不记得 Dockerfile 位于哪里 查找 Dockerfile 的最佳方式是什么 是否有可能以某种方式在给定图像的情况下获取其位置 我尝试使用
  • 他们为什么使用; Java/C++ 中的结束语句

    他们应该不会用过吧 结束声明 他们可以使用 gt 来调用方法 这只是一个疏忽吗 还是这里面有更深层次的原因 Java 选择分号是为了拥有与 C 和 C 类似的语法 C 选择它的语法与 C 类似 我猜 C 选择分号是因为 B ALGOL 和
  • Ruby 语法:突破 'each.. do..' 块

    我正在开发一个红宝石 on Rails应用程序 我的问题更多是关于Ruby句法 我有一个带有类方法的模型类self check class Cars lt ActiveRecord Base def self check name self
  • 在 Rails 中发表评论时显示用户名

    我有一个名为 Pins 的应用程序 用于用户发布专辑评论 我创建了一个评论模型 供其他用户对评论发表评论 我很难让评论说 发布者 然后显示发布它们的用户的姓名 这是一些代码 引脚型号has many comments用户模型has many
  • django - 获取多个时期的最大值

    我刚开始使用 django 我的模型非常简单 由时间戳和值 温度 每分钟更新 组成 我想检索过去 7 天中每一天的最大值 我需要查询7次还是有 捷径 您可以利用annotate https docs djangoproject com en
  • 如何从字符串中删除单词列表

    我想做的 在 Clojure 中 例如 我有一个需要删除的单词向量 def forbidden words the many more 和一个字符串向量 def strings the movie list this is a string
  • DataGridView 开头没有选定的行

    在我的 WinForms 中我有DataGridView 我想一次选择整行所以我设置SelectionMode as FullRowSelect 现在我遇到了问题 因为一开始我的表单在第一行下划线 所选行集为空 第一行未选择但只是下划线 我
  • PHP:数组中连续元素的数量[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我一直在研究一个问题 找出数组中最大的一组连续数字 假设我们有一个数组 5 43 4 56 3 2 44 57 58 1 该数组中最大
  • 扩展 Ascii 在控制台中不起作用!

    例如 System out println 显示为 同样适用于 System out println u255a 为什么这不起作用 标准输出确实支持这些字符 所以我不明白 See 这个问题 https stackoverflow com q
  • django admin内联多对多自定义字段

    您好 我正在尝试在 django admin 中自定义我的内联 这是我的模型 class Row models Model name models CharField max length 255 class Table models Mo
  • 没有 staticfiles 应用程序的 Django 1.4 管理静态文件

    Django 1 4 发行说明 https docs djangoproject com en dev releases 1 4 state 如果您隐式依赖管理静态文件的路径 在 Django 源代码中 您需要更新该路径 这 文件从 dja
  • 带参数的 get_absolute_url

    My urls py urlpatterns url r profile profile profile name profile My model class Reg models Model name models CharField
  • Django 管理模型ArrayField 更改分隔符

    我的模型看起来像这样 from django contrib postgres fields import ArrayField class Trigger models Model solutions ArrayField models
  • 使用 OpenCVsolvePnP 在 OpenGL 中实现增强现实

    我正在尝试使用 Android 构建增强现实应用程序BoofCV http boofcv org index php title Main Page Java 的 OpenCV 替代品 和 OpenGL ES 2 0 我有一个标记 我可以使
  • 如何配置 log4j2 Web 应用程序

    我对 Web 应用程序不太陌生 最近我需要使用日志记录机制 为此我选择了 Log4J2 我浏览了那里的指南 并下载了所需的库 到目前为止我就是这么做的 1 Added following jars to web inf lib log4j
  • 在 Go 模板范围循环中,循环外部声明的变量是否会在每次迭代时重置?

    我正在尝试使用在 Go 模板范围循环之外声明的变量来查看上一篇文章是否与当前文章发生在同一天 这是一个简化的示例 Where Posts是一个 post 结构数组 每个结构都有一个 Content and a Date prevDate r