为了账号安全,请及时绑定邮箱和手机立即绑定

go 'Template.Execute' 如何读取匿名结构的参数字段?

go 'Template.Execute' 如何读取匿名结构的参数字段?

Go
Qyouu 2021-12-06 19:52:32
在使用 Go 编码时,使用 html.template 包,调用 template.Execute。我有一个问题,它如何读取其参数的匿名结构字段。我阅读了源代码,但没有意义。我没有想法。/usr/local/go/src/html/template/tempalte.go L.78type Template struct {    ...    text *template.Template    ...}// escape escapes all associated templates.func (t *Template) escape() error {    t.nameSpace.mu.Lock()    defer t.nameSpace.mu.Unlock()    if t.escapeErr == nil {        if t.Tree == nil {            return fmt.Errorf("template: %q is an incomplete or empty template%s", t.Name(), t.text.DefinedTemplates())        }        if err := escapeTemplate(t, t.text.Root, t.Name()); err != nil {            return err         }    } else if t.escapeErr != escapeOK {        return t.escapeErr    }       return nil }// Execute applies a parsed template to the specified data object,// writing the output to wr.// If an error occurs executing the template or writing its output,// execution stops, but partial results may already have been written to// the output writer.// A template may be executed safely in parallel.func (t *Template) Execute(wr io.Writer, data interface{}) error {    if err := t.escape(); err != nil {        return err     }       return t.text.Execute(wr, data)}GoDoc 演示了它的用法,像这样使用其 interface{} 参数调用 Execute;data := struct {    Title string    Items []string}{    Title: "My another page",    Items: []string{},}err = t.Execute(os.Stdout, data)
查看完整描述

1 回答

?
不负相思意

TA贡献1777条经验 获得超10个赞

如果您查看从包中调用此函数return的Executeit 调用:t.text.Executetext/template


   132  func (t *Template) Execute(wr io.Writer, data interface{}) (err error) {

   133      defer errRecover(&err)

   134      value := reflect.ValueOf(data)

   135      state := &state{

   136          tmpl: t,

   137          wr:   wr,

   138          vars: []variable{{"$", value}},

   139      }

   140      if t.Tree == nil || t.Root == nil {

   141          state.errorf("%q is an incomplete or empty template%s", t.Name(), t.DefinedTemplates())

   142      }

   143      state.walk(value, t.Root)

   144      return

   145  }

所以它将使用reflect包将变量解析到模板中。


这是正在发生的事情的一个小例子:http : //play.golang.org/p/ih1Ei33NsO


查看完整回答
反对 回复 2021-12-06
  • 1 回答
  • 0 关注
  • 195 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信