Не могу добавить время к дате в Google без ошибки разбора - PullRequest
0 голосов
/ 14 января 2019

Работает:

{{ $temp := timestampToDate $var.date }}
{{ $temp.Format 2006/01/02 }}

Не работает

{{ $temp := timestampToDate $var.date }}
{{ $temp := $temp.AddDate(0,-1,0) }}    
{{ $temp.Format 2006/01/02 }}

Он говорит, что не может проанализировать файл со второй строкой, но в чем проблема? Насколько я вижу, я правильно использую команду.

1 Ответ

0 голосов
/ 14 января 2019

Сначала может показаться, что проблема связана с использованием синтаксиса := для уже существующей переменной, но это не проблема, как показано в этом примере:

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 &#43;0000 UTC m=&#43;0.000000001

2009-10-10 23:00:00 &#43;0000 UTC<nil>
...