在golang模板的循环中访问循环外的值

huangapple go评论102阅读模式
英文:

Access out of loop value inside golang template's loop

问题

我有这个结构体:

type Site struct {
    Name string
    Pages []int
}

我将Site的一个实例传递给一个模板

如果我想要写出所有页面的列表,我可以这样做:

{{range .Pages}}
    <li><a href="{{.}}">{{.}}</a></li>
{{end}}

现在,如何在循环中使用Name字段(例如将href更改为Name/page)的最简单方法是什么?

请注意,基于外部对象是传递给模板的全局对象的事实的解决方案是可以的。

英文:

I have this struct :

type Site struct {
    Name string
    Pages []int
}

I pass an instance of Site to a template.

If I want to write a list of all pages, I do

{{range .Pages}}
    <li><a href="{{.}}">{{.}}</a></li>
{{end}}

Now, what's the simplest way to use the Name field inside the loop (for example to change the href to Name/page) ?

Note that a solution based on the fact that the external object is the global one that was passed to the template would be OK.

答案1

得分: 113

你应该知道传递给模板的变量可以作为$来使用。

{{range .Pages}}
    <li><a href="{{$.Name}}/{{.}}">{{.}}</a></li>
{{end}}

(请参阅text/template文档中的“Variables”部分。)

英文:

You should know that the variable passed in to the template is available as $.

{{range .Pages}}
    <li><a href="{{$.Name}}/{{.}}">{{.}}</a></li>
{{end}}

(See the text/template documentation under "Variables".)

答案2

得分: 17

{{$name := .Name}}
{{range $page := .Pages}}

  • {{$page}}
  • {{end}}

    Or simply make Pages a map with Name as value?

    type Site struct {
    Pages map[string]string
    }

    {{range $page, $name := .Pages}}

  • {{$page}}
  • {{end}}

    英文:

    What about:

    {{$name := .Name}}
    {{range $page := .Pages}}
        <li><a href="{{$name}}/{{$page}}">{{$page}}</a></li>
    {{end}}
    

    Or simply make Pages a map with Name as value?

    type Site struct {
        Pages map[string]string
    }
    
    
    {{range $page, $name := .Pages}}
        <li><a href="{{$name}}/{{$page}}">{{$page}}</a></li>
    {{end}}
    

    答案3

    得分: 12

    看起来没有比显式声明一个变量来引用外部对象(或其属性)更简单的解决方案:

    {{$out := .}}
    {{range .Pages}}
    	<li><a href="{{$out.Name}}/{{.}}">{{.}}</a></li>
    {{end}}
    

    **编辑:**这个答案不再正确,请看chowey的答案。

    英文:

    It looks like there's no simpler solution than to explicitly declare a variable for the outer object (or its properties) :

    {{$out := .}}
    {{range .Pages}}
    	<li><a href="{{$out.Name}}/{{.}}">{{.}}</a></li>
    {{end}}
    

    EDIT : this answer isn't the right one any more, look at chowey's one instead.

    huangapple
    • 本文由 发表于 2013年5月24日 20:03:08
    • 转载请务必保留本文链接:https://go.coder-hub.com/16734503.html
    匿名

    发表评论

    匿名网友

    :?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

    确定