如何在Golang模板中检查非标准对象的等价性

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

How to check non standard object equivalence in golang template

问题

我正在使用HTML模板输出一个下拉列表,代码如下:

{{range .Organisations}}
 <option value="{{.Uuid}}">{{.Name}}</option>
{{end}}

我想通过使用eq比较器来指示其中一个项目被选中。我知道可能会有一个潜在的复杂性,就是.Uuid是一个*gocql.UUID类型的变量。我尝试这样做:

{{range .Organisations}}
 <option value="{{.Uuid}}"{{if eq $.Contact.Organisation .Uuid}} selected="selected"{{end}}>{{.Name}}</option>
{{end}}

但是会出现以下错误信息:

page:32:36: 执行"submit_scholarship"时出错,位置在<eq $.Contact.Organis...>:调用eq时发生错误:比较的类型无效

如果能给我指点一下正确的方向,我将不胜感激。

英文:

I am outputting a dropdown list using a html template, as follows:

{{range .Organisations}}
 &lt;option value=&quot;{{.Uuid}}&quot;&gt;{{.Name}}&lt;/option&gt;
{{end}}

I want to indicate that one of the items should be selected by doing an eq comparator. The only potential complication I am aware of is that the .Uuid is a *gocql.UUID, I am trying to do this:

{{range .Organisations}}
 &lt;option value=&quot;{{.Uuid}}&quot;{{if eq $.Contact.Organisation .Uuid}} selected=&quot;selected&quot;{{end}}&gt;{{.Name}}&lt;/option&gt;
{{end}}

But it results in the following error message:

> page:32:36: executing "submit_scholarship" at <eq $.Contact.Organis...>: error calling eq: invalid type for comparison

Any pointers in the right direction would be much appreciated.

答案1

得分: 3

eq只适用于基本类型。您可以添加自定义函数来实现此功能。
http://play.golang.org/p/rkYnlqmeLA

package main

import (
	"html/template"
	"os"
)

type s struct {
	Name []byte
	Uuid []byte
}

func main() {
	data := s{[]byte("aa"), []byte("aa")}

	funcMap := template.FuncMap{
		"equals": func(a []byte, b []byte) bool {
			return string(a) == string(b)
		},
	}

	var html = `{{if equals .Name .Uuid }}hi{{end}}`
	tmpl, _ := template.New("test").Funcs(funcMap).Parse(html)

	err := tmpl.Execute(os.Stdout, data)
	if err != nil {
		println(err.Error())
	}

}
英文:

eq only works on basic types. You can add a custom function to do this.
http://play.golang.org/p/rkYnlqmeLA

package main

import (
	&quot;html/template&quot;
	&quot;os&quot;
)

type s struct {
	Name []byte
	Uuid []byte
}

func main() {
	data := s{[]byte(&quot;aa&quot;), []byte(&quot;aa&quot;)}

	funcMap := template.FuncMap{
		&quot;equals&quot;: func(a []byte, b []byte) bool {
			return string(a) == string(b)
		},
	}

	var html = `{{if equals .Name .Uuid }}hi{{end}}`
	tmpl, _ := template.New(&quot;test&quot;).Funcs(funcMap).Parse(html)

	err := tmpl.Execute(os.Stdout, data)
	if err != nil {
		println(err.Error())
	}

}

huangapple
  • 本文由 发表于 2014年11月7日 12:24:02
  • 转载请务必保留本文链接:https://go.coder-hub.com/26794013.html
匿名

发表评论

匿名网友

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

确定