This repository contains a Go code generator based on Go Template and a set of Go Template examples.
Go templates are one of the best choice to build a fast and small code generation tool.
The sample code generator tool presented here can generate any type of code from Go templates and json or yaml data.
Download zip archive from github or clone this repository
git clone https://github.com/phcollignon/Go-Template
You can use it as a command line or as a go library to dynamically generate code in go programs.
Go in Go-Template/src
directory.
cd Go-Template/src
go build
Add Go-Template to your binaries or to your PATH (i.e sudo mv Go-Template /usr/local/bin
)
Go in one of the examples directory and run Go-Template with a data file and a template file as parameters.
cd Go-Template/examples/01-values
Go-Template -d email.json -t email.tpl
By default, generated files are created in the same folder as the json file.
You can change the ouput directory with -o outputdirectory
Go-Template -d email.json -t email.tpl -o /tmp/gocodegentest
If your Json Data file is designed to generate multiple files (see Example 5 below), use the following command :
Go-Template -d mailing.json -t mailing.tpl -m multi
We provide here some code generation examples, please note that gocodgen is based on go templates, so for more advanced features, you can look at go template documentation.
Let's suppose the following email template :
Dear {{.Name}},
Hello,
We would like to assign some tasks for {{.Project}} project :
{{range .Topics}}
- {{.}}
{{end}}
Can we plan a meeting on {{.Date}} ?
Regards,
And the following data :
{
"Name": "Phil",
"Date": "01/01/2018",
"Project": "Go-Template",
"Topics": [
"write documentation",
"publish to github.com",
"add more examples"
]
}
The following command,
Go-Template -d 01-values/email.json -t 01-values/email.tpl
generates email.generated.txt
file
Dear Phil,
Hello,
We would like to assign some tasks for Go-Template project :
- write documentation
- publish to github.com
- add more examples
Can we plan a meeting on 01/01/2018 ?
Regards,
Let's suppose the following template to generate SQL code for table create :
{{range .Schema.Table}}
CREATE TABLE {{ .Name}} (
{{range $idx, $column := .Column}}
{{if $idx }} , {{end}}{{ $column.Name}} {{$column.Type}} {{if $column.Size }} {{$column.Size}} {{end}}
{{end}}
)
{{end}}
And the following schema definition :
{
"Schema": {
"Table": [
{
"Name": "EMPLOYEE",
"Column": [
{
"Name": "ID",
"Type": "INTEGER"
},
{
"Name": "FIRSTNAME",
"Type": "VARCHAR",
"Size": "256"
},
{
"Name": "LASTNAME",
"Type": "VARCHAR",
"Size": "256"
},
{
"Name": "AGE",
"Type": "INTEGER"
}
]
},
{
"Name": "PRODUCT",
"Column": [
{
"Name": "ID",
"Type": "INTEGER"
},
{
"Name": "NAME",
The following command,
"Type": "VARCHAR",
"Size": "256"
},
{
"Name": "PRICE",
"Type": "REAL"
}
]
}
]
}
}
Go-Template -d schema.json -t createtable.tpl
generates the following file
CREATE TABLE EMPLOYEE (
ID INTEGER
, FIRSTNAME VARCHAR 256
, LASTNAME VARCHAR 256
, AGE INTEGER
)
CREATE TABLE PRODUCT (
ID INTEGER
, NAME VARCHAR 256
, PRICE REAL
)
Let's imagine you want to compare some numbers :
{{ range .Number}}
{{if eq .n1 .n2 }}
{{- .n1}} = {{.n2}}
{{else}}
{{- if lt .n1 .n2 }}
{{- .n1}} < {{.n2}}
{{else}}
{{- .n1}} > {{.n2}}
{{end}}
{{end}}
{{end}}
And the following numbers to be compared :
{
"Number" : [
{"n1":1,"n2":2},
{"n1":5,"n2":3},
{"n1":2,"n2":2},
{"n1":1,"n2":5},
{"n1":6,"n2":6},
{"n1":5,"n2":2}
]
}
Go-Template -d numbers.json -t numbers.tpl
generates the following file
1 < 2
5 > 3
2 = 2
1 < 5
6 = 6
5 > 2
Let's now consider a more advanced sample where you want to apply some custome functions in your code generation.
The JavaBeans setter and getter functions must be written as getPropertyName()
for propertyName
property.
First, add a custom function in my-funcs.go
file
var MyFuncMap = map[string]interface{}{
"ToGetterName": ToGetterName,
"ToSetterName": ToSetterName}
func ToGetterName(name string) string {
return "get" + strings.Title(name)
}
func ToSetterName(name string) string {
return "set" + strings.Title(name)
}
Now you can use that custom function in your Go template :
public class User implements java.io.Serializable {
{{range .User.Property }}
private {{.Type}} {{ .Name }};
{{end}}
{{range .User.Property }}
public {{.Type}} {{ .Name | ToGetterName }}(){
return this.{{.Name}};
}
{{end}}
{{range .User.Property }}
public void {{ .Name | ToSetterName }}({{.Type}} {{.Name}}){
this.{{.Name}} = {{.Name}};
}
{{end}}
}
Either compile the gocodgen for your platform or install Go and run
go run main.go my-funcs.go -d numbers.json -t numbers.tpl
For the following json data,
{
"User": {
"Name" : "Person",
"Property": [
{
"Name": "firstName",
"Type": "String"
},
{
"Name": "lastName",
"Type": "String"
},
{
"Name": "age",
"Type": "Integer"
}
]
}
}
You get this result :
public class User implements java.io.Serializable {
private String firstName;
private String lastName;
private Integer age;
public String getFirstName(){
return this.firstName;
}
public String getLastName(){
return this.lastName;
}
public Integer getAge(){
return this.age;
}
public void setFirstName(String firstName){
this.firstName = firstName;
}
public void setLastName(String lastName){
this.lastName = lastName;
}
public void setAge(Integer age){
this.age = age;
}
}
Sometime, you want to generate a set of files from some data.
The most obvious example is a mailing .. let's have the same email as in Example 01
Dear {{.Name}},
Hello,
We would like to assign some tasks for {{.Project}} project :
{{range .Topics}}
- {{.}}
{{end}}
Can we plan a meeting on {{.Date}} ?
Regards,
You include in your Json Data file, a Files
key containing a table of objects.
Each object has a FileName
used to create the file, and a Data
object which container the code generation data.
{
"Files": [{
"FileName": "test1",
"Data": {
"Name": "phil",
"Date": "01/01/2018",
"Project": "Go-Template",
"Topics": [
"write documentation",
"publish to github.com",
"add more examples"
]
}
},
{
"FileName": "test2",
"Data": {
"Name": "john",
"Date": "01/01/2018",
"Project": "Go-Template",
"Topics": [
"write documentation",
"publish to github.com",
"add more examples"
]
}
},
{
"FileName": "test3",
"Data": {
"Name": "peter",
"Date": "01/01/2018",
"Project": "Go-Template",
"Topics": [
"write documentation",
"publish to github.com",
"add more examples"
]
}
}]
}
The following command (do not forget -m multi
flag) :
Go-Template -d mailing.json -t mailing.tpl -m multi
generates 3 different files :
test1 :
Dear phil,
Hello,
We would like to assign some tasks for Go-Template project :
- write documentation
- publish to github.com
- add more examples
Can we plan a meeting on 01/01/2018 ?
Regards,
test2 :
Dear john,
Hello,
We would like to assign some tasks for Go-Template project :
- write documentation
- publish to github.com
- add more examples
Can we plan a meeting on 01/01/2018 ?
Regards,
test3 :
Dear peter,
Hello,
We would like to assign some tasks for Go-Template project :
- write documentation
- publish to github.com
- add more examples
Can we plan a meeting on 01/01/2018 ?
Regards,
Here is the list of Go template examples. You can use them in your own code or with the generator documented below.
directory | template | values | description |
---|---|---|---|
01-values | contact.tpl | contact.json | values interpolation |
01-values | contact-with.tpl | contact.json | values interpolation with scoped object "with" action |
01-values | contact-key-index.tpl | contact.json | values and keys interpolation with "index" function |
01-values | email.tpl | email.yaml | values interpolation with array index |
01-values | properties-whitespace.tpl | properties-whitespace.yaml | manage whitespace in java property file |
02-loop | db-schema.tpl | db-schema.json | Iterate on values |
03-conditions | logic.tpl | logic.json | Logic functions |
03-conditions | numbers.tpl | numbers.json | Logic operators |
04-builtin-functions | logs.tpl | logs.json | Index and length of a list |
04-builtin-functions | print.tpl | print.json | Formatted print function |
04-builtin-functions | escape.tpl | escape.json | URL query string, html and javascript escape |
05-sprig-functions | N/A | N/A | http://masterminds.github.io/sprig/ |
06-custom-functions | javabean.tpl | javabean.json | Use of custom functions (defined in my-funcs.go) |
07-multiplefiles | mailing.tpl | mailing.json | Generate multiple files with one template an one value file |
08-subtemplate | template.tpl | template.json | Call a named sub-template |