Параметр для перехода к функции пользовательского шаблона

# #function #go #templates #customization

Вопрос:

Пожалуйста, взгляните на https://play.golang.org/p/EbWA15toVa9

в которой я

  • определить func iterate(count int) []int в строке 25
  • позвоните iterate 5 по телефону 15

Все это нормально, но, когда я позвонил iterate (printf "%d" 3) по 20-й линии, я получил ошибку:

template: t:12:39: executing "t" at <3>: wrong type for value; expected int; got string

Разве сначала не (printf "%d" 3) будет выполнено , а когда его передадут iterate , оно станет iterate 3 ? Почему вместо этого произошла вышеуказанная ошибка?

Полный код прилагается:

 package main

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

var x = `{{define "t1"}}
{{- index . 0}} {{index . 1}} {{index . 2}} {{index . 3}}
{{end -}}

hello, {{template "t1" args . 543 false 0.1234}}

{{- range $val := iterate 5 }}
  {{ $val }}
{{- end }}
{{ (printf "%d" 3) }}

{{- range $val := iterate (printf "%d" 3) }}
  {{ $val }}
{{- end }}
`

func iterate(count int) []int {
    var i int
    var Items []int
    for i = 0; i < (count); i   {
        Items = append(Items, i)
    }
    return Items
}

func args(vs ...interface{}) []interface{} { return vs }

func main() {
    t := template.Must(template.New("t").Funcs(template.FuncMap{"args": args, "iterate": iterate}).Parse(x))
    err := t.Execute(os.Stdout, "foobar")
    if err != nil {
        log.Fatal(err)
    }
}
 

Ответ №1:

Вы правы, что printf “%d” 3 сначала оценивается результат. Проблема, по-видимому, заключается в том, что printf “%d” 3 создается строка, но у вашей iterate функции есть аргумент типа int . Они string не будут преобразованы.

Комментарии:

1. В самом деле! play.golang.org/p/dAIyeALlvza . Спасибо!