GoLang在模板索引中出现了问题。

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

GoLang hangs in template indexing

问题

我正在尝试使用以下模板填充表格:

<table class="table">
    <tr>
        <td>Repo name</td>
        <td>Repo id</td>
    </tr>
    {{range $i, $e := .GitHubRepoNames}}
    <tr>
        <td>{{$e}}</td>
        <td>{{index .GitHubRepoNames $i}}</td>
    </tr>
    {{end}}
</table>

当我执行这个模板时,输出结果为:

<table class="table">
            <tr>
                <td>Repo name</td>
                <td>Repo id</td>
            </tr>
            
            <tr>
                <td>https://api.github.com/repos/ertemplin/cah/issues{/number}</td>
                <td>

当我在模板中去掉{{index}}调用时:

<table class="table">
    <tr>
        <td>Repo name</td>
        <td>Repo id</td>
    </tr>
    {{range $i, $e := .GitHubRepoNames}}
    <tr>
        <td>{{$e}}</td>
        <td>{{$i}}</td>
    </tr>
    {{end}}
</table>

它会输出完整的范围:

<table class="table">
            <tr>
                <td>Repo name</td>
                <td>Repo id</td>
            </tr>
            
            <tr>
                <td>https://api.github.com/repos/ertemplin/cah/issues{/number}</td>
                <td>0</td>
            </tr>
</table>

在模板的第一个实例中,可能是什么原因导致输出被中断?

英文:

I'm trying to fill in a table with the following template:

&lt;table class=&quot;table&quot;&gt;
    &lt;tr&gt;
        &lt;td&gt;Repo name&lt;/td&gt;
        &lt;td&gt;Repo id&lt;/td&gt;
    &lt;/tr&gt;
    {{range $i, $e := .GitHubRepoNames}}
    &lt;tr&gt;
        &lt;td&gt;{{$e}}&lt;/td&gt;
        &lt;td&gt;{{index .GitHubRepoNames $i}}&lt;/td&gt;
    &lt;/tr&gt;
    {{end}}
&lt;/table&gt;

When I execute this template, it outputs:

&lt;table class=&quot;table&quot;&gt;
			&lt;tr&gt;
				&lt;td&gt;Repo name&lt;/td&gt;
				&lt;td&gt;Repo id&lt;/td&gt;
			&lt;/tr&gt;
			
			&lt;tr&gt;
				&lt;td&gt;https://api.github.com/repos/ertemplin/cah/issues{/number}&lt;/td&gt;
				&lt;td&gt;

When I run the template without the {{index}} call:

&lt;table class=&quot;table&quot;&gt;
    &lt;tr&gt;
        &lt;td&gt;Repo name&lt;/td&gt;
        &lt;td&gt;Repo id&lt;/td&gt;
    &lt;/tr&gt;
    {{range $i, $e := .GitHubRepoNames}}
    &lt;tr&gt;
        &lt;td&gt;{{$e}}&lt;/td&gt;
        &lt;td&gt;{{$i}}&lt;/td&gt;
    &lt;/tr&gt;
    {{end}}
&lt;/table&gt;

it outputs the complete range:

&lt;table class=&quot;table&quot;&gt;
			&lt;tr&gt;
				&lt;td&gt;Repo name&lt;/td&gt;
				&lt;td&gt;Repo id&lt;/td&gt;
			&lt;/tr&gt;
			
			&lt;tr&gt;
				&lt;td&gt;https://api.github.com/repos/ertemplin/cah/issues{/number}&lt;/td&gt;
				&lt;td&gt;0&lt;/td&gt;
			&lt;/tr&gt;
&lt;/table&gt;

What could be causing the output to be interrupted in the first instance of my template?

答案1

得分: 6

当执行模板时,会返回一个错误:

var buf bytes.Buffer
err := tpl.Execute(&buf, map[string]interface{}{
    "GitHubRepoNames": []string{
        "https://api.github.com/repos/ertemplin/cah/issues{/number}",
    },
})
fmt.Println(err, buf.String())

错误信息为:

template: ex:9:20: 在类型为字符串的字段中无法评估字段GitHubRepoNames

这意味着.被更改为$e。我不确定为什么需要这样做索引($e似乎足够了),但你可以这样做:

<td>{{index $.GitHubRepoNames $i}}</td>

$在文档中有解释:

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

英文:

When you execute a template an error is returned:

var buf bytes.Buffer
err := tpl.Execute(&amp;buf, map[string]interface{}{
	&quot;GitHubRepoNames&quot;: []string{
		&quot;https://api.github.com/repos/ertemplin/cah/issues{/number}&quot;,
	},
})
fmt.Println(err, buf.String())

The error is:

> template: ex:9:20: executing "ex" at <.GitHubRepoNames>: can't evaluate field GitHubRepoNames in type string

Which means the . is being changed to $e. I'm not sure why you need to do the index like this ($e seems like it ought to be sufficient) but you can do this:

&lt;td&gt;{{index $.GitHubRepoNames $i}}&lt;/td&gt;

$ is explained by the documentation:

> When execution begins, $ is set to the data argument passed to Execute, that is, to the starting value of dot.

huangapple
  • 本文由 发表于 2013年12月21日 14:59:35
  • 转载请务必保留本文链接:https://go.coder-hub.com/20716471.html
匿名

发表评论

匿名网友

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

确定