golang模版解析

在公司构建用户个人站点时用到模版,总结使用静态页面的原因及解析过程。因页面应用在站点SEO有局限,用户希望增加网站权重,所以使用静态页面。解析过程介绍了相关函数、模版及代码情况,嵌套模版时子模版需指定上下文。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在公司构建用户个人站点的过程中使用使用到了模版template,在此总结一下

一、为什么要使用静态页面

页面应用对于在站点SEO方面存在局限性,而用户又希望可以通过SEO来增加网站的权重,所以使用了静态页面

二、解析过程

用到的函数

func (t *Template) New(name string) *Template

用给定的名称name创建一个template,这个name在后面的ParseFiles里必须存在,不然会保存panic: template: "example" is an incomplete or empty template

func (t *Template) ParseFiles(filenames ...string) (*Template, error)

参数为一个或多个文件名,默认把一个文件作为主模版

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

将给的数据应用到解析的模版上,如果报错,将停止执行,与ExecuteTemplate的区别在于, ExecuteTemplate可以通过第二个参数指定主模版

func (t *Template) Funcs(funcMap FuncMap) *Template

在模版中有时需要获取data中没有的数据、或者要经过特殊处理后的数据,FuncMap就可以使用起来的

模版:

header.tpl

{{define "header"}}
<html lang="">
    <head>
        <title>{{.Title}}</title>
    </head>
    <body>
{{end}}

index.tpl

{{template "header" .}}
<div>{{.Content}}</div>
<div>name: {{get "name"}}</div>
{{template "footer"}}

footer.tpl

{{define "footer"}}
    </body>
</html>
{{end}}

在模版嵌套时,子模版需要指定相应的上下文才能正确的渲染{{template "header" .}},这里通过.将所有数据传递到子模版

go部分代码如下:

type RenderFactory struct{}

func getValue(key string) string {
	switch key {
	case "name":
		return "abelce"
	case "sex":
		return "male"
	default:
		return ""
	}
}

func parseTemplate(tpl string) (*template.Template, error) {

	header := "./template/header.tpl"
	footer := "./template/footer.tpl"
	file := "./template/" + tpl + ".tpl"
	// 需判断文件是否存在

	t := template.New(tpl + ".tpl")
	t.Funcs(template.FuncMap{"get": getValue})

	t, err := t.ParseFiles(file, header, footer)
	if err != nil {
		return nil, err
	}
	return t, nil
}

func (rf *RenderFactory) Render() error {
	outputFile, err := os.Create("/data/index.html")
	if err != nil {
		return err
	}

	t, err := parseTemplate("index")
	if err != nil {
		return err
	}

	tmp := &Tmp{
		Title:   "go | template",
		Content: "hello world",
	}
	err = t.Execute(outputFile, tmp)
	if err != nil {
		return err
	}

	return nil
}

完整代码github

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值