2014-01-29 21 views
1

Вот мое определение функции, которая возвращает строкуКак распечатать возвращаемое значение функции?

"addClassIfActive": func(tab string, ctx *web.Context) string

Я пытаюсь напечатать это следующим образом:

<a href="/home/"{{ printf "%s" addClassIfActive "home" .Context }}>Home</a>

HTTP ответ становится прекращено, когда я пытаюсь Распечатать.

Что я делаю неправильно?

Возвращение булево, а затем с помощью если работает, еще мне очень интересно, как напечатать строку возвращается из функции

ответ

4

Проблема у вас есть то, что "home" и .Context будет 3: 4-й и: й аргумент printf, а не аргументы addClassIfActive. Возвращаемое значение addClassIfActive становится аргументом 2: n для printf.

Но решение прост: вам не нужно использовать printf для печати.

Если функция просто возвращает строку, вы можете просто напечатать его в письменной форме:

{{addClassIfActive "home" .Context}} 

Полный рабочий пример:

package main 

import (
    "html/template" 
    "os" 
) 

type Context struct { 
    Active bool 
} 

var templateFuncs = template.FuncMap{ 
    "addClassIfActive": func(tab string, ctx *Context) string { 
     if ctx.Active { 
      return tab + " content" 
     } 

     // Return nothing 
     return "" 
    }, 
} 

var htmlTemplate = `{{addClassIfActive "home" .Context}}` 

func main() { 
    data := map[string]interface{}{ 
     "Context": &Context{true}, // Set to false will prevent addClassIfActive to print 
    } 

    // We create the template and register out template function 
    t := template.New("t").Funcs(templateFuncs) 
    t, err := t.Parse(htmlTemplate) 
    if err != nil { 
     panic(err) 
    } 

    err = t.Execute(os.Stdout, data) 
    if err != nil { 
     panic(err) 
    } 

} 

Выход:

дома содержание

Playground

+0

Я попытался, что он печатал zgotmplz вместо того, что функция вернула –

+0

мою ошибку, это было небезопасно HTML, http://stackoverflow.com/questions/14765395/why-am-i-seeing -zgotmplz-in-my-go-html-template-output –

+0

А, да. Я никогда не думал о том, где вы пытались вывести строку. Рад, что вы это решили. – ANisus

0

Вы не можете вызывать функции в шаблонах.

Что вы можете сделать, это использовать FuncMaps:

templates.go

var t = template.New("base") 
// ParseFiles or ParseGlob, etc. 
templateHelpers := template.FuncMap{ 
     "ifactive": AddClassIfActive, 
    } 
    t = t.Funcs(templateHelpers) 

your_template.tmpl

... 
<span class="stuff">{{ if eq .Context | ifactive }} thing {{ else }} another thing {{ end }}</span> 
... 

Я не проверял этот точный синтаксис , но я использую FuncMaps elsew Вот. Обязательно прочитайте better docs at text/template на FuncMaps для получения дополнительных примеров.

Смежные вопросы