Сначала может показаться, что проблема связана с использованием синтаксиса :=
для уже существующей переменной, но это не проблема, как показано в этом примере:
t := template.Must(template.New("").Parse(`{{$temp := "aa"}}{{$temp}}
{{$temp := "bb"}}{{$temp}}`))
fmt.Println(t.Execute(os.Stdout, nil))
Какие выходы (попробуйте на Go Playground ):
aa
bb<nil>
Но, конечно, если переменная уже существует, вы должны использовать присваивание =
, потому что :=
создаст новую переменную, которая, если происходит внутри другого блока (например, {{range}}
или {{if}}
), измененное значение не останется за пределами блока.
Настоящей проблемой является синтаксис вызова функции:
{{ $temp := $temp.AddDate(0,-1,0) }}
В шаблонах Go вы не можете использовать обычный синтаксис вызова, вам просто нужно перечислить аргументы, разделенные пробелами, например ::
{{ $temp = $temp.AddDate 0 -1 0 }}
Ошибка, возвращаемая Template.Execute()
, указывает на это:
panic: template: :3: unexpected "(" in operand
Подробно в template/Pipelines
:
Команда - это простое значение (аргумент) или вызов функции или метода, возможно с несколькими аргументами:
Argument
The result is the value of evaluating the argument.
.Method [Argument...]
The method can be alone or the last element of a chain but,
unlike methods in the middle of a chain, it can take arguments.
The result is the value of calling the method with the
arguments:
dot.Method(Argument1, etc.)
functionName [Argument...]
The result is the value of calling the function associated
with the name:
function(Argument1, etc.)
Functions and function names are described below.
* +1039 * Пример:
t := template.Must(template.New("").Funcs(template.FuncMap{
"now": time.Now,
}).Parse(`{{$temp := now}}
{{$temp}}
{{$temp = $temp.AddDate 0 -1 0}}
{{$temp}}`))
fmt.Println(t.Execute(os.Stdout, nil))
Вывод (попробуйте на Go Playground ):
2009-11-10 23:00:00 +0000 UTC m=+0.000000001
2009-10-10 23:00:00 +0000 UTC<nil>