在Golang模板中使用struct方法

时间:2014-12-05 22:15:18

标签: go go-templates

Go模板中的struct方法通常与公共结构属性的方式相同,但在这种情况下它不起作用:http://play.golang.org/p/xV86xwJnjA

{{with index . 0}}
  {{.FirstName}} {{.LastName}} is {{.SquareAge}} years old.
{{end}}  

错误:

executing "person" at <.SquareAge>: SquareAge is not a field
of struct type main.Person

同样的问题:

{{$person := index . 0}}
{{$person.FirstName}} {{$person.LastName}} is
  {{$person.SquareAge}} years old.

相反,这有效:

{{range .}}
  {{.FirstName}} {{.LastName}} is {{.SquareAge}} years old.
{{end}}

如何在{{with}}和{{$ person}}示例中调用SquareAge()方法?

1 个答案:

答案 0 :(得分:8)

如先前在Call a method from a Go template中所述,

定义的方法
func (p *Person) SquareAge() int {
    return p.Age * p.Age
}

仅适用于*Person类型。

由于您不会在Person方法中改变SquareAge对象,因此您可以将接收方从p *Person更改为p Person,这样就可以了与你以前的切片。

或者,如果您替换

var people = []Person{
    {"John", "Smith", 22},
    {"Alice", "Smith", 25},
    {"Bob", "Baker", 24},
}

var people = []*Person{
    {"John", "Smith", 22},
    {"Alice", "Smith", 25},
    {"Bob", "Baker", 24},
}

它也会起作用。

工作示例#1:http://play.golang.org/p/NzWupgl8Km

工作示例#2:http://play.golang.org/p/lN5ySpbQw1