GoLang挂在模板索引中

ert*_*lin 2 templates go slice

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

<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>
Run Code Online (Sandbox Code Playgroud)

当我执行此模板时,它输出:

<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>
Run Code Online (Sandbox Code Playgroud)

当我在没有{{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>
Run Code Online (Sandbox Code Playgroud)

它输出完整的范围:

<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>
Run Code Online (Sandbox Code Playgroud)

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

Cal*_*leb 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())
Run Code Online (Sandbox Code Playgroud)

错误是:

template:ex:9:20:在<.GitHubRepoNames>处执行"ex":无法在字符串类型中计算字段GitHubRepoNames

这意味着.正在改变$e.我不确定为什么你需要像这样做索引($e似乎它应该足够)但你可以这样做:

<td>{{index $.GitHubRepoNames $i}}</td>
Run Code Online (Sandbox Code Playgroud)

$ 由文档解释:

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