/OblivionOcean/Goh
Goh is a precompiled fast template engine for Go language.
English| Simplified Chinese
Table of contents
- characteristic
- Performance Testing
- Install
- use
- grammar
characteristic
- Precompiled template engine to improve running speed.
- Almost compatible with the grammar of Go language.
- 0 dependencies.
- Automatically recompile after changing the template file.
Performance Testing
from/slinso/goTemplateBenchmarkGet the local test results, and the code is the same as the Hero part's test code. BenchmarkComplexGoDirectBuffer and BenchmarkComplexGoStaticString are written to the Buffer and the static String respectively, so no calculation is done, so complex template test ranks first.
goos: windows
goarch: amd64
pkg: /SlinSo/goTemplateBenchmark
cpu: Intel(R) Core(TM) i7-10700 CPU @ 2.90GHz
# Complex template testing
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
# Simple template testing
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
BenchmarkTemp-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 /SlinSo/goTemplateBenchmark 65.553s
Install
go get -u /OblivionOcean/Goh
go install /OblivionOcean/Goh
# Dependency
go get /x/tools/cmd/goimports
go install /x/tools/cmd/goimports
use
~ $ Goh
Usage of ./Goh:
-dest string
generated golang files dir, it will be the same with source if not set
-ext string
source file extensions, comma splitted if many (default ".html")
-pkg string
the generated template package name, default is template (default "template")
-src string
the html template file or directory (default "./")
Please refer to the complete usage methodExample program
<%: func UserList(title string, userList []string, buf *) %>
<!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 main
import (
"bytes"
"net/http"
"/OblivionOcean/Goh/example/template"
)
func main() {
("/users", func(w , req *) {
var userList = []string{
"Alice",
"Bob",
"Tom",
}
buffer := new()
("User List", userList, buffer)
(())
})
(":8080", nil)
}
grammar
Document modification from/shiyanhui/hero
There are nine sentences in Goh, and they are:
- Function definition statement
<%: func define %>
- This statement defines the function corresponding to the template. If there is no function definition statement in a template, the final result will not generate the corresponding function.
- The last parameter of the function must be
*
or, hero will automatically recognize the name of the parameter and write the result into the parameter.
- example:
<%: func UserList(userList []string, buffer *) %>
<%: func UserList(userList []string, w ) %>
<%: func UserList(userList []string, w ) (int, error) %>
- Template inheritance statement
<%~ "parent template" %>
- This statement declares the template to be inherited.
- example:
<%~ "" >
- Template include statement
<%+ "sub template" %>
- This statement loads the template to include into the template, working principle and
C++
In-house#include
A little similar. - example:
<%+ "" >
- This statement loads the template to include into the template, working principle and
- Package import statement
<%! go code %>
- This statement is used to declare all code outside the function, including dependency package import, global variables, const, etc.
- This statement will not be inherited by the sub-template
- example:
<%!
import (
"fmt"
"strings"
)
var a int
const b = "hello, world"
func Add(a, b int) int {
return a + b
}
type S struct {
Name string
}
func (s S) String() string {
return
}
%>
- Block statement
<%@ blockName { %> <% } %>
This syntax is not supported yet, please use another method instead.
- Go code statement
<% go code %>
- This statement defines the code part inside the function.
- example:
<% for _, user := range userList { %>
<% if user != "Alice" { %>
<%= user %>
<% } %>
<% } %>
<%
a, b := 1, 2
c := Add(a, b)
%>
- Native value statement
<%==[t] variable %>
、<%- variable %>
- This statement converts variables to string.
-
t
It is the type of variable, hero will automaticallyt
to select the conversion function.t
The values to be selected are: -
b
: bool -
i
: int, int8, int16, int32, int64 -
u
: byte, uint, uint8, uint16, uint32, uint64 -
f
: float32, float64 -
s
: string -
bs
: []byte -
v
: interface
Notice:
- if
t
No settings, thent
Default iss
. - It's best not to use it
v
because its corresponding conversion function is("%v", variable)
, this function is very slow. - example:
<%== "hello" %>
<%==i 34 %>
<%==u Add(a, b) %>
<%==s %>
- Escape value statement
<%= statement %>
- After converting the variable into string, the statement passes
Memory escape.
-
t
Follow the above native value statementt
Same. - example:
<%= a %>
<%= a + b %>
<%= Add(a, b) %>
<%= %>
- Comment statements
<%# note %>
- This statement comments on the relevant template, and the comments will not be generated into the go code.
- example:
<# This is a comment >
.
grateful
Shiyanhui/hero