Как отмечают другие, это невозможно. Шаблоны анализируются во время выполнения без помощи компилятора Go. Таким образом, разрешить произвольный синтаксис Go было бы невозможно (хотя обратите внимание, что это не было бы невозможно, поскольку стандартная библиотека lib содержит все инструменты для разбора исходного текста Go, см. Пакеты с «префиксом» go/
в стандартная библиотека). Согласно философии дизайна, сложная логика должна быть вне шаблонов.
Вернуться к вашему примеру:
struct{Foo1, Foo2 string}{"Bar1", "Bar2"}
Это структура составной литерал , и он не поддерживается ни в шаблонах, ни при вызове другого шаблона, ни в других местах.
Вызов другого шаблона с пользовательским «аргументом» имеет следующий синтаксис (цитата из text/template
: Действия ):
{{template "name" pipeline}}
The template with the specified name is executed with dot set
to the value of the pipeline.
TL; DR; Конвейер может быть константой, выражением, обозначающим поле или метод некоторого значения (где будет вызываться метод и будет использоваться его возвращаемое значение), это может быть вызов какой-либо встроенной в шаблон функции или пользовательской зарегистрированной функции или значения на карте.
Где Трубопровод :
Конвейер - это, возможно, последовательность цепочек «команд». Команда - это простое значение (аргумент) или вызов функции или метода, возможно с несколькими аргументами:
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.
И Аргумент :
Аргумент - это простое значение, обозначаемое одним из следующих:
- A boolean, string, character, integer, floating-point, imaginary
or complex constant in Go syntax. These behave like Go's untyped
constants. Note that, as in Go, whether a large integer constant
overflows when assigned or passed to a function can depend on whether
the host machine's ints are 32 or 64 bits.
- The keyword nil, representing an untyped Go nil.
- The character '.' (period):
.
The result is the value of dot.
- A variable name, which is a (possibly empty) alphanumeric string
preceded by a dollar sign, such as
$piOver2
or
$
The result is the value of the variable.
Variables are described below.
- The name of a field of the data, which must be a struct, preceded
by a period, such as
.Field
The result is the value of the field. Field invocations may be
chained:
.Field1.Field2
Fields can also be evaluated on variables, including chaining:
$x.Field1.Field2
- The name of a key of the data, which must be a map, preceded
by a period, such as
.Key
The result is the map element value indexed by the key.
Key invocations may be chained and combined with fields to any
depth:
.Field1.Key1.Field2.Key2
Although the key must be an alphanumeric identifier, unlike with
field names they do not need to start with an upper case letter.
Keys can also be evaluated on variables, including chaining:
$x.key1.key2
- The name of a niladic method of the data, preceded by a period,
such as
.Method
The result is the value of invoking the method with dot as the
receiver, dot.Method(). Such a method must have one return value (of
any type) or two return values, the second of which is an error.
If it has two and the returned error is non-nil, execution terminates
and an error is returned to the caller as the value of Execute.
Method invocations may be chained and combined with fields and keys
to any depth:
.Field1.Key1.Method1.Field2.Key2.Method2
Methods can also be evaluated on variables, including chaining:
$x.Method1.Field
- The name of a niladic function, such as
fun
The result is the value of invoking the function, fun(). The return
types and values behave as in methods. Functions and function
names are described below.
- A parenthesized instance of one the above, for grouping. The result
may be accessed by a field or map key invocation.
print (.F1 arg1) (.F2 arg2)
(.StructValuedMethod "arg").Field
Правильным решением было бы зарегистрировать пользовательскую функцию, которая создает значение, которое вы хотите передать вызову шаблона, как вы можете видеть в этом связанном / возможном дубликате: Golang передает несколько значений из шаблона в шаблон?
Другое, половинное решение может заключаться в использовании встроенных функций print
или printf
для объединения значений, которые вы хотите передать, но для этого потребуется разбить другой шаблон.