当前位置: 首页 > 面试题库 >

在Go模板中,访问范围内的父/全局管道

邢洋
2023-03-14
问题内容

{{range pipeline}} T1 {{end}}text/template包中的某个动作内,是否可以在range动作之前访问管道值,或者是否可以将父/全局管道作为参数传递给Execute?

工作示例显示了我尝试执行的操作:

package main

import (
    "os"
    "text/template"
)

// .Path won't be accessible, because dot will be changed to the Files element
const page = `{{range .Files}}<script src="{{html .Path}}/js/{{html .}}"></script>{{end}}`

type scriptFiles struct {
    Path string
    Files []string
}

func main() {
    t := template.New("page")
    t = template.Must(t.Parse(page))

    t.Execute(os.Stdout, &scriptFiles{"/var/www", []string{"go.js", "lang.js"}})
}

play.golang.org


问题答案:

使用$变量(推荐)

从软件包文本/模板文档中:

开始执行时,将$设置为传递给Execute的数据参数,即dot的起始值。

正如@Sandy所指出的,因此可以使用来访问外部作用域中的Path $.Path

const page = `{{range .Files}}<script src="{{html $.Path}}/js/{{html .}}"></script>{{end}}`

使用自定义变量(旧答案)

发帖后几分钟就找到了一个答案。
通过使用变量,可以将值传递到range范围中:

const page = `{{$p := .Path}}{{range .Files}}<script src="{{html $p}}/js/{{html .}}"></script>{{end}}`


 类似资料:
  • 问题内容: 在或中时,将更改的范围。您如何访问调用范围? 问题答案: 记录在文本/模板文档中: 开始执行时,将$设置为传递给Execute的数据参数,即dot的起始值。

  • 问题内容: 我有一个像这样的模板: 我得到下面的输出: 我想渲染如下: 我无法摆脱最后一个逗号来制作有效的json。还是可能以某种方式将完整的范围块发送到某些自定义联接功能? 问题答案: 这是一个如何使用模板的示例,但是如果要生成JSON,我强烈建议使用第二种方法。 坚持使用模板 由于您在地图上范围很广,因此您无法(简单地)做到这一点。如果是切片,则可以检查index变量(例如:Go模板除去ran

  • 我有一个考试示例,它询问我是否可以访问包含值1的x变量?解决方案是我可以,但我感兴趣的是具体怎么做?

  • 问题内容: 如何在解决方案中全局禁止StyleCop警告? 该解决方案使用Jenkins(连续构建和集成工具)不断构建,并应用了所有StyleCop规则。该解决方案使用TAB字符而不是4个空格,因为这是我的开发团队所采用的标准。因此,StlyeCop会引发几个SA1027警告。 如何从詹金斯删除SA1027警告?那也有帮助。 在每个C#文件上提供SuppressMessage看起来并不好。这就是为

  • 问题内容: 我有这个模板,页面顶部有一个表格,要求发送的任何一篇帖子中的threadID(它们都是相同的,都是带有特定threadID的所有帖子的一部分),这显然不是工作,我唯一的想法是 如果以上任何一个不清楚,这里是Post的结构和方法。 并将切片的起源发送到模板 问题答案: 您可以将其作为一个结构传递,如下所示: 然后像这样的东西会工作

  • 问题内容: Go博客中的“ Go maps in action ”条目指出: 地图不能安全地并发使用:未定义同时读取和写入地图时会发生什么情况。如果您需要从并发执行的goroutine中读取和写入映射,则必须通过某种同步机制来调解访问。保护地图的一种常见方法是使用sync.RWMutex。 但是,一种常见的访问地图的方法是使用关键字遍历它们。出于并发访问的目的,不清楚在一个循环内执行是“读”还是该