2012-04-17 13 views
28

だが、私は、HTML /テンプレートからこのメソッドを使用するにはどうすればよい呼び出し方法

type Person struct { 
    Name string 
} 
func (p *Person) Label() string { 
    return "This is " + p.Name 
} 

があるとしましょうか?私はテンプレートのようなものが必要になります:

{{ .Label() }} 

答えて

33

括弧を省略するといいでしょう。例:

package main 

import (
    "html/template" 
    "log" 
    "os" 
) 

type Person string 

func (p Person) Label() string { 
    return "This is " + string(p) 
} 

func main() { 
    tmpl, err := template.New("").Parse(`{{.Label}}`) 
    if err != nil { 
     log.Fatalf("Parse: %v", err) 
    } 
    tmpl.Execute(os.Stdout, Person("Bob")) 
} 

documentationによれば、2番目のいずれかのタイプerrorである場合(任意の型の)一つの値又は2つの値を返す任意のメソッドを呼び出すことができます。後者の場合、Executeは、それがnilでなければエラーを返し、テンプレートの実行を停止します。

+3

ありがとうございます!私はそれを試みましたが、私の方法の受信者は、人の代わりに人でした。だからそれはポインタの受信機では動作しません、それはキャッチするようです。 – Blacksad

+3

これはポインタ受信機でも動作します。しかし、 'func(p * Person)Label()'を持つときに '* Person'型の値だけがLabel()メソッドを持つことに注意してください。あなたが定義していないので、 'Person'でそのメソッドを呼び出すことはできません。 – tux21b

+0

また、{{&。 }}のアドレスを取得します。私のテンプレートに? – Blacksad

17

あなたも

type Person struct { 
    Name string 
} 
func (p *Person) Label(param1 string) string { 
    return "This is " + p.Name + " - " + param1 
} 

をたどり、その後、テンプレートにテンプレート者はテンプレートに渡されたPerson型の変数であると仮定すると

{{with person}} 
    {{ .Label "value1"}} 
{{end}} 

を書くように機能するためにパラメータを渡すことができます。

関連する問題