Goh:一款Go语言的预编译快速模板引擎。(Benchmark排名第一)

news/2025/2/8 15:43:04/文章来源:https://www.cnblogs.com/fgaoxing/p/18704410

https://github.com/OblivionOcean/Goh

Goh 是一款Go语言的预编译快速模板引擎。

English | 简体中文

目录

  • 特性
  • 性能测试
  • 安装
  • 使用
  • 语法

特性

  • 预编译模板引擎,提升运行速度。
  • 几乎兼容·Go语言的语法。
  • 0依赖。
  • 更改模板文件后自动重新编译。

性能测试

从 https://github.com/slinso/goTemplateBenchmark 获取,目前为本地测试结果,代码与Hero部分的测试代码相同,BenchmarkComplexGoDirectBuffer和BenchmarkComplexGoStaticString分别是写入Buffer和静态String,所以不做计算,因此复杂模板测试排名第一

goos: windows
goarch: amd64
pkg: github.com/SlinSo/goTemplateBenchmark
cpu: Intel(R) Core(TM) i7-10700 CPU @ 2.90GHz
# 复杂模板测试
BenchmarkComplexGolang-16                  36800             31428 ns/op            6562 B/op        290 allocs/op
BenchmarkComplexGolangText-16              88148             13370 ns/op            2235 B/op        107 allocs/op
BenchmarkComplexEgo-16                    486294              2411 ns/op             568 B/op         31 allocs/op
BenchmarkComplexQuicktemplate-16         1367928               878.1 ns/op             0 B/op          0 allocs/op
BenchmarkComplexTempl-16                  788673              1400 ns/op             408 B/op         11 allocs/op
BenchmarkComplexFtmpl-16                  293755              3982 ns/op            3534 B/op         38 allocs/op
BenchmarkComplexFtmplInclude-16           317361              4142 ns/op            3534 B/op         38 allocs/op
BenchmarkComplexMustache-16                90567             13748 ns/op            7274 B/op        156 allocs/op
BenchmarkComplexGorazor-16                361304              3195 ns/op            3688 B/op         24 allocs/op
BenchmarkComplexJetHTML-16                189176              5928 ns/op             532 B/op          5 allocs/op
BenchmarkComplexHero-16                  1410391               863.5 ns/op             0 B/op          0 allocs/op
BenchmarkComplexGoh-16                   2304783               535.4 ns/op             0 B/op          0 allocs/op
BenchmarkComplexJade-16                  1826784               651.8 ns/op             0 B/op          0 allocs/op
BenchmarkComplexGoDirectBuffer-16        2890996               414.6 ns/op             0 B/op          0 allocs/op
BenchmarkComplexGoHyperscript-16         1717754               778.6 ns/op             0 B/op          0 allocs/op
BenchmarkComplexGoStaticString-16       84003024                14.44 ns/op            0 B/op          0 allocs/op
# 简单模板测试
BenchmarkGolang-16                        300493              3691 ns/op             768 B/op         35 allocs/op
BenchmarkGolangText-16                   1000000              1073 ns/op             128 B/op          7 allocs/op
BenchmarkGoDirectBuffer-16              21959280                55.81 ns/op            0 B/op          0 allocs/op
BenchmarkGoCustomHtmlAPI-16             14034298                85.06 ns/op            0 B/op          0 allocs/op
BenchmarkGoFunc3-16                     14962965                68.62 ns/op            0 B/op          0 allocs/op
BenchmarkEgo-16                          2577276               464.3 ns/op            85 B/op          8 allocs/op
BenchmarkHB-16                            280617              4445 ns/op            2448 B/op         51 allocs/op
BenchmarkQuicktemplate-16                7013572               168.9 ns/op             0 B/op          0 allocs/op
BenchmarkFtmpl-16                        1000000              1000 ns/op             774 B/op         12 allocs/op
BenchmarkAce-16                           179811              6605 ns/op            1121 B/op         40 allocs/op
BenchmarkAmber-16                         268149              3800 ns/op             849 B/op         36 allocs/op
BenchmarkMustache-16                      523143              2636 ns/op            1722 B/op         30 allocs/op
BenchmarkPongo2-16                        350612              3862 ns/op            2074 B/op         32 allocs/op
BenchmarkHandlebars-16                    162860              7261 ns/op            3423 B/op         75 allocs/op
BenchmarkGorazor-16                      1562088               772.3 ns/op           512 B/op          5 allocs/op
BenchmarkSoy-16                           639549              2200 ns/op            1224 B/op         19 allocs/op
BenchmarkJetHTML-16                      1960117               600.4 ns/op             0 B/op          0 allocs/op
BenchmarkHero-16                        10452396               113.9 ns/op             0 B/op          0 allocs/op
BenchmarkGoh-16                         14838537                81.97 ns/op            0 B/op          0 allocs/op
BenchmarkJade-16                        15025261                78.85 ns/op            0 B/op          0 allocs/op
BenchmarkTempl-16                        4015622               293.1 ns/op            96 B/op          2 allocs/op
BenchmarkGomponents-16                    479330              2882 ns/op            1112 B/op         56 allocs/op
ok      github.com/SlinSo/goTemplateBenchmark   65.553s

安装

go get -u github.com/OblivionOcean/Goh
go install github.com/OblivionOcean/Goh# 依赖
go get golang.org/x/tools/cmd/goimports
go install golang.org/x/tools/cmd/goimports

使用

~ $ Goh
Usage of ./Goh:-dest stringgenerated golang files dir, it will be the same with source if not set-ext stringsource file extensions, comma splitted if many (default ".html")-pkg stringthe generated template package name, default is template (default "template")-src stringthe html template file or directory (default "./")

完整的使用方法请参考实例程序

<%: func UserList(title string, userList []string, buf *bytes.Buffer) %><!DOCTYPE html><html><head><title><%= title %></title></head><body><h1><%= title %></h1><ul><% for _, user :=range userList { %><% if user !="Alice" { %><li><%= user %></li><% } %><% } %></ul></body></html>
package mainimport ("bytes""net/http""github.com/OblivionOcean/Goh/example/template"
)func main() {http.HandleFunc("/users", func(w http.ResponseWriter, req *http.Request) {var userList = []string{"Alice","Bob","Tom",}buffer := new(bytes.Buffer)template.UserList("User List", userList, buffer)w.Write(buffer.Bytes())})http.ListenAndServe(":8080", nil)
}

语法

文档修改自https://github.com/shiyanhui/hero

Goh总共有九种语句,他们分别是:

  • 函数定义语句 <%: func define %>
    • 该语句定义了该模板所对应的函数,如果一个模板中没有函数定义语句,那么最终结果不会生成对应的函数。
    • 该函数最后一个参数必须为*bytes.Buffer或者io.Writer, hero会自动识别该参数的名字,并把把结果写到该参数里。
    • 例:
      • <%: func UserList(userList []string, buffer *bytes.Buffer) %>
      • <%: func UserList(userList []string, w io.Writer) %>
      • <%: func UserList(userList []string, w io.Writer) (int, error) %>
  • 模板继承语句 <%~ "parent template" %>
    • 该语句声明要继承的模板。
    • 例: <%~ "index.html" >
  • 模板include语句 <%+ "sub template" %>
    • 该语句把要include的模板加载进该模板,工作原理和C++中的#include有点类似。
    • 例: <%+ "user.html" >
  • 包导入语句 <%! go code %>
    • 该语句用来声明所有在函数外的代码,包括依赖包导入、全局变量、const等。
  • 该语句不会被子模板所继承
  • 例:
    <%!import ("fmt""strings")var a intconst b = "hello, world"func Add(a, b int) int {return a + b}type S struct {Name string}func (s S) String() string {return s.Name}%>
  • 块语句 <%@ blockName { %> <% } %>

暂不支持该语法,请使用其他方式代替。

  • Go代码语句 <% go code %>
  • 该语句定义了函数内部的代码部分。
  • 例:
<% for _, user := range userList { %><% if user != "Alice" { %><%= user %><% } %>
<% } %><%a, b := 1, 2c := Add(a, b)
%>
  • 原生值语句 <%==[t] variable %><%- variable %>
  • 该语句把变量转换为string。
  • t是变量的类型,hero会自动根据t来选择转换函数。t的待选值有:
  • b: bool
  • i: int, int8, int16, int32, int64
  • u: byte, uint, uint8, uint16, uint32, uint64
  • f: float32, float64
  • s: string
  • bs: []byte
  • v: interface

注意:

  • 如果t没有设置,那么t默认为s.
  • 最好不要使用v,因为其对应的转换函数为fmt.Sprintf("%v", variable),该函数很慢。
  • 例:
<%== "hello" %>
<%==i 34  %>
<%==u Add(a, b) %>
<%==s user.Name %>
  • 转义值语句 <%= statement %>
  • 该语句把变量转换为string后,又通过html.EscapesString记性转义。
  • t跟上面原生值语句中的t一样。
  • 例:
<%= a %>
<%= a + b %>
<%= Add(a, b) %>
<%= user.Name %>
  • 注释语句 <%# note %>
  • 该语句注释相关模板,注释不会被生成到go代码里边去。
  • 例: <# 这是一个注释 >.

感谢

Shiyanhui/hero

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/880845.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Rust编程Bug解决

Brainfuck工程,遇到版本以来错误: https://github.com/mohanson/brainfuck/tree/master1. cargo update 的详细解释 cargo update 是 Cargo(Rust 的包管理器)的一个命令,用于更新项目的依赖版本。以下是它的具体行为和作用: (1) 更新 Cargo.lock 文件Rust 项目有两个关键…

唯品会联盟唯享客-各种广告平台推广下的DeepLink链接与UniversalLink链接生成及下单转化归因ROI联调等对接技术的实现

唯品会联盟&唯享客-各种广告平台推广下的DeepLink链接与UniversalLink链接生成及下单转化归因ROI联调等对接技术的实现。 唯品会电商作为国内第四大电商平台,以做品牌为主,佣金相当与淘宝京东拼多多较高一些。但是限制也较多点。比如不允许投流推广,发现了轻则警告扣除部…

.Net9中通过HttpClient简单调用Ollama中的DeepSeek R1模型

本文主要使用.Net9中的HttpClient组件,调用本地部署的Ollama提供的API接口,获取对应的问答信息。1、🥇测试环境VS2022;.Net9控制台程序;HttpClient组件;本地部署的Ollama环境DeepSeek R1模型(deepseek-r1:1.5b)关于本地部署的Ollama环境,可参见文章【通过Ollama本地部…

变革管理的黄金法则:五大模型+工具,助你轻松应对项目管理挑战

变革模型与项目管理工具的结合运用可以形成一个系统化、高效化的变革管理体系。通过明确变革需求与目标、执行变革计划、评估与反馈以及持续优化改进等步骤,可以确保变革的顺利实施和成功落地。项目管理中的变革模型是指一系列指导和管理组织内部变革过程的框架和方法。这些模…

ollama部署本地模型的一些坑

1.ollama pull时进度回退:不知是否最近太多人下载导致服务器问题,下载大点的模型经常进度条往回退,解决方法就是每隔一会关闭进程重新下载,断点续传可以继续下载# 用法:python .\run.py 模型名字import subprocess import time import os import sys import signaldef run…

P5250 【深基17.例5】木材仓库(set)

由于题目保证木材的长度互不相同所以很自然的想到要用set op=1时 使用find函数查找length 如果it==s.end(),说明仓库里没有该长度的木材,应该insert 反之输出“Already Exist” op=2时 使用lower_bound 函数查找第一个大于等于length的木材,如果*it=length说明该仓库中有与…

海外泼天流量丨浅谈全球化技术架构

全球化是对技术架构的终极挑战,面临的不仅仅是技术的问题,而是包含了经济、文化等多因素差异的用户关系问题。积极借助遍布全球的云计算基础设施和云原生的架构设计原则,将能更加高效的构建高可用的全球化技术架构,支持全球业务的持续增长。作者:唐三、望宸,白玙、榆松、…

d2l-CV-微调

动手学深度学习-计算机视觉-微调微调(fine tuning)是计算机视觉中非常重要的一种技术。 微调的作用:让在大数据集上训练得到的模型,能够提高在小数据集上任务的精度(例如用ImageNet上训练的模型去识别热狗数据集) 微调是迁移学习(transfer learning)中的一种技术,将从 源数…

“爆款”批量生成,如何实现一键创作 AI 有声绘本?

有声读物作为备受欢迎的内容形式之一,已在教育、影视、文化及娱乐等多个领域广泛应用。本方案通过云原生应用开发平台 CAP、函数计算 FC 和百炼模型服务,实现了有声绘本读物的自动化创作,解决了传统制作中步骤繁琐、周期长和高技术门槛的问题,显著提高了创作效率。作者:寒…

数据可视化分析平台 DataEase

https://www.cnblogs.com/cmt/p/186550891Panel 联合会员已上线,立即了解元旦之后,我们和国内领先的开源软件公司飞致云达成了重要合作,合作分两部分,一是推广飞致云旗下的免费开源软件,一是双方合作推出联合会员。 飞致云旗下有多款免费开源软件,1月6日上线了第一个文字…

一文搞懂大模型备案全部内容

大模型备案对象 大模型备案主要面向开发、运营大模型的企业、机构等主体(官方要求是具备舆论属性和社会动员能力的产品,而大模型产品基本都符合这两点特征)。比如,像百度开发了文心一言这样的大模型,百度就属于大模型备案的目标群体。 大模型备案材料 主要材料如下: 1、大…

SeaTunnel数据同步(Oracle to mysql)

因为datax2023年9月以后就没有更新,所以想找个新的切活跃的etl开源工具。 apache SeaTunnel是一个非常易用、超高性能的分布式数据集成平台,支持实时海量数据同步。 每天可稳定高效同步数百亿数据,已被近百家企业应用于生产。 直接安装体验:export version="2.3.9&quo…