html模板中的golang乘法算法

时间:2016-02-01 09:33:13

标签: algorithm templates go

我是golang的新手。我在html / template中使用乘法时遇到了问题。 一些代码如下。

模板代码:

 {{range $i,$e:=.Items}}
      <tr>
           <td>{{add $i (mul .ID .Number)}}</td>
           <td>{{.Name}}</td>
      </tr>
  {{end}}

.go code

type Item struct{
        ID int
        Name string
    }
func init() {
    itemtpl,_:=template.New("item.gtpl").
        Funcs(template.FuncMap{"mul": Mul, "add": Add}).
        ParseFiles("./templates/item.gtpl")
}

func itemHandle(w http.ResponseWriter, req *http.Request) {

    items:=[]Item{Item{1,"name1"},Item{2,"name2"}}
    data := struct {
            Items []Item
            Number int
            Number2 int
        }{
            Items:    items,
            Number:   5,
            Number2:  2,
        }
        itemtpl.Execute(w, data)
}
func Mul(param1 int, param2 int) int {
    return param1 * param2
}
func Add(param1 int, param2 int) int {
    return param1 + param2
}

当我使用上面的代码时,它不会输出任何内容。但是当我使用下面数组之外的代码时,它将输出10。

<html>
<body>
    {{mul .Number .Number2}}
</html>
</body>

我谷歌很多。我找不到像我一样可用的东西。我想在html / template中使用数组中的乘法。有人能告诉我我的代码有什么问题吗?

1 个答案:

答案 0 :(得分:2)

template.Execute()返回error,您应该经常检查一下。你会这样做的吗?

  

template:item.gtpl:3:33:在&lt; .Number&gt;处执行“item.gtpl”:Number不是struct类型main.Item的字段

“问题”是{{range}}将管道(.)更改为当前项,因此在{{range}}内:

{{add $i (mul .ID .Number)}}

.Number会引用Item类型的字段或方法,因为您正在循环[]Item。但是您的Item类型没有此类方法或字段。

使用$.Number,它将引用“顶级”Number,而不是当前Item值的字段:

{{add $i (mul .ID $.Number)}}

Go Playground 上尝试修改后的工作代码。

$记录在text/template

  

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