Go 模板中作为管道的匿名结构

Go 模板中作为管道的匿名结构,go,go-templates,go-html-template,anonymous-struct,Go,Go Templates,Go Html Template,Anonymous Struct,在html/template中是否有方法执行以下操作 {{template "mytemplate" struct{Foo1, Foo2 string}{"Bar1", "Bar2"}}} 我的意思是,实际上在模板中,就像上面一样。不是通过在FuncMap中注册的函数返回结构 我试过了,但是Parsepanics。也许我只是把语法弄错了?正如其他人指出的那样,这是不可能的。模板在运行时解析,不需要Go编译器的帮助。因此,允许任意Go语法是不可行的(尽管请注意,这不是不可能的,因为标准库包含解析

html/template
中是否有方法执行以下操作

{{template "mytemplate" struct{Foo1, Foo2 string}{"Bar1", "Bar2"}}}
我的意思是,实际上在模板中,就像上面一样。不是通过在
FuncMap
中注册的函数返回结构


我试过了,但是
Parse
panics。也许我只是把语法弄错了?

正如其他人指出的那样,这是不可能的。模板在运行时解析,不需要Go编译器的帮助。因此,允许任意Go语法是不可行的(尽管请注意,这不是不可能的,因为标准库包含解析Go源文本的所有工具,请参阅标准库中带有前缀的包)。根据设计理念,复杂的逻辑应该在模板之外

回到你的例子:

struct{Foo1, Foo2 string}{"Bar1", "Bar2"}
这是一个结构,在模板中不受支持,无论是在调用另一个模板时还是在其他位置

使用自定义“参数”调用另一个模板具有以下语法(引用自):

TL;博士管道可以是常量、表示某个值的字段或方法的表达式(将调用该方法并使用其返回值),也可以是对某个“模板内置”函数或自定义注册函数的调用,或者是映射中的值

在哪里:

管道可能是“命令”的链式序列。命令是一个简单的值(参数)或函数或方法调用,可能有多个参数:

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
正确的解决方案是注册一个自定义函数,该函数构造要传递给模板调用的值,正如您在以下相关/可能的副本中所看到的:


另一个半解决方案是使用内置的
print
printf
函数连接要传递的值,但这需要在另一个模板中拆分。

不,这是不可能的。模板不会执行任意的Go代码。它们执行模板语法,这在模板包中有明确的文档记录。除了文档中提供的语法外,不允许使用其他语法。@Adrian如果文档中有明确的语法,为什么不共享指向特定部分的引用或链接?没有引用或特定部分。模板语法在这里有明确的定义:但是,出于明显的原因,它并没有列举所有它不做的事情。它描述了它所做的一切,而你在问题中试图做的并不在这些事情之列。谢谢你的详细回答!
- 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