dtf54486
2016-01-09 03:55
浏览 76
已采纳

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

In coding with Go, with html.template package, template.Execute is called.
I have a question, how could it read the field of anonymous structure of its parameter.
I read the source code, but it doesn't make sense. I don't have an idea.

/usr/local/go/src/html/template/tempalte.go L.78

type 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 demonstrates its usage, calling Execute with its interface{} paramter like this;

data := struct {
    Title string
    Items []string
}{
    Title: "My another page",
    Items: []string{},
}


err = t.Execute(os.Stdout, data)

图片转代码服务由CSDN问答提供 功能建议

在使用Go编码时,使用html.template包,template.Execute被调用。
我有一个 问题,它如何读取其参数的匿名结构的字段。
我读取了源代码,但这没有任何意义。 我不知道。

/usr/local/go/src/html/template/tempalte.go L.78 < / blockquote>

  type模板结构{
 ... 
文本* template.Template 
 ... 
} 
 
 //转义会转义所有关联的模板。\  nfunc(t * Template)escape()错误{
 t.nameSpace.mu.Lock()
延迟t.nameSpace.mu.Unlock()
如果t.escapeErr == nil {
如果是t.Tree  == nil {
返回fmt.Errorf(“模板:%q是不完整或空的模板%s”,t.Name(),t.text.DefinedTemplates())
} 
如果err:= escapeTemplate  (t,t.text.Root,t.Name());  err!= nil {
返回err 
} 
}否则,如果t.escapeErr!= scapeOK {
返回t.escapeErr 
} 
返回nil 
} 
 
 //执行将应用已解析 模板到指定的数据对象,
 //将输出写入wr。
 //如果执行模板或写入其输出时发生错误,
 //执行停止,但是可能已经将部分结果写入了\  n //输出编写器。
 //可以安全地并行执行模板。
func(t * Template)Execute(wr io.Writer,data interface {})error {
 if err:= t.escape  ();  err!= nil {
返回err 
} 
返回t.text.Execute(wr,data)
} 
   
 
 

GoDoc演示了其用法, 像这样用其接口{}调用Execute;

  data:= struct {
标题字符串
项目[] string 
} {
标题:“我的 另一页”,
项目:[] string {},
} 
 
 
err = t.Execute(os.Stdout,data)
   
 
  • 写回答
  • 好问题 提建议
  • 关注问题
  • 收藏
  • 邀请回答

1条回答 默认 最新

  • douyan5481 2016-01-09 04:19
    已采纳

    If you look at the return of Execute it calls t.text.Execute which is calling this function from the text/template package:

       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  }
    

    So it will use the reflect package to parse the variables into the template.

    Here's a little example of whats happening: http://play.golang.org/p/ih1Ei33NsO

    已采纳该答案
    评论
    解决 无用
    打赏 举报

相关推荐 更多相似问题