模板 设计 与 API 详解 (Golang , Django)

本文介绍了模板设计的基本语法和Golang标准库模板的使用,包括运行时输入、变量定义、表达式、循环、判断、封装和注释等关键概念,并给出了代码示例。

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


前言

文本模板是大家平时经常用的 , 例如服务端渲染,代码生成工具. 在我看来模板就是程序. 模板引擎就是编程语言, 渲染模板就是运行程序. 本文主要梳理了模板引擎作为一种特殊的编程语言提供了哪些接口(语法)使得开发人员可以灵活的编写模板以实现自己的需求

一、模板语法

模板引擎作为一种简易的编程语言, 需要提供以下语法

  • 运行时输入
  • 变量定义/使用
  • 表达式
  • 循环
  • 判断
  • 封装
  • 注释

模板与编程语言的一大区别是代码和数据和在一起的,所以要提供接口(语法)区分代码的数据的

二、示例

1. Golang标准库模板

代码如下(示例):

  • 模板标签

{{ }}

  • 输入
    go模板接受单个输入
    通过{{ . }}获取输入
    支持的所有的go类型 Slice, int64, int, string, float32, float64
    如果输入是一个Struct/Map 可以通过{{.Field}} 获取其属性
package main

import (
	"fmt"
	"os"
	"text/template"
)

func main() {
	t, _ := template.New("tpl").Parse(`{{ . }}`)
	fmt.Println(t.Execute(os.Stdout, "hello world"))
	t, _ = template.New("tpl").Parse(`{{ .Name }}, {{.Age}}`)
	fmt.Println(t.Execute(os.Stdout, struct {
		Name string
		Age  int64
	}{"小明", 18}))
	// output
	// hello world<nil>
	// 小明, 18<nil>
}
  • 变量定义/使用

定义: {{ $var := . }}
使用 {{ {{ $var}} }}

package main

import (
	"fmt"
	"os"
	"text/template"
)

func main() {
	t, _ := template.New("tpl").Parse(`{{ $var := . }} {{ $var}}`)
	fmt.Println(t.Execute(os.Stdout, "hello world"))
	// output
	// hello world<nil>
}
  • 表达式
    不支持表达式,但可以在使用函数调用, 调用是通过管道的方式实现的
    函数分之内置函数,和自定义韩式
    {{ function arg1 arg2 }}
    管道 {{ . | function1 | function2}}
package main

import (
	"fmt"
	"math"
	"os"
	"text/template"
)

func main() {
	t, _ := template.New("tpl").Funcs(
		template.FuncMap{
			"Add": func(a, b int) int {
				return a + b
			},
			"Pow": func(a, b int) int {
				return int(math.Pow(float64(a), float64(b)))
			},
		}).Parse(`{{ Add 1 .  | Pow  3 }}`)
	fmt.Println(t.Execute(os.Stdout, 1))
	// output
	//9<nil>
}
  • 循环
    {{range $k, $v := .Var}} {{$k}} => {{$v}} {{end}}
package main

import (
	"fmt"
	"os"
	"text/template"
)

func main() {
	t, _ := template.New("tpl").Parse(`{{range $k, $v := .}} {{$k}}:{{$v}} {{end}}`)
	fmt.Println(t.Execute(os.Stdout, map[string]interface{}{
		"Name": "小明",
		"Age":  18,
	}))
	// output
	// Age:18  Name:小明 <nil>
}

  • 判断
    {{if ...}} ... {{end}}
    {{if ...}} ... {{else}} ... {{end}}
    {{if ...}} ... {{else if ...}} ... {{end}}
package main

import (
	"fmt"
	"os"
	"text/template"
)

func main() {
	t, _ := template.New("tpl").Parse(`{{if lt .Age  18  }} 未成年人禁止入内 {{end}}`)

	fmt.Println(t.Execute(os.Stdout, map[string]interface{}{
		"Name": "小明",
		"Age":  16,
	}))
	// output
	//  未成年人禁止入内 <nil>
}
  • 封装
    定义模板

  • 注释


总结

提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值