golang template 用作类似mybatis前期一些准备

栏目: Java · 发布时间: 5年前

内容简介:在gin融合sqlx包时,发现在写复杂的sql的时候会比较复杂,而在java一直比较钟爱mybatis编写sql,希望在golang也能找到类似的做法,在查阅很多博客看到使用模板进行类似mybatis xml生成sql,所以先把原先学习语法没有进行学习的模板进行一些储备,只是一部分认为能用到的一些知识导入模板文件1.导入单个文件

背景

在gin融合sqlx包时,发现在写复杂的 sql 的时候会比较复杂,而在 java 一直比较钟爱mybatis编写sql,希望在golang也能找到类似的做法,在查阅很多博客看到使用模板进行类似mybatis xml生成sql,所以先把原先学习语法没有进行学习的模板进行一些储备,只是一部分认为能用到的一些知识

使用

导入模板文件

1.导入单个文件

template.ParseFiles("template_test.tpl")

2.导入多个文件(不同dao使用不同文件表示)

template.ParseGlob("*.tpl")

3.加入自定义函数FuncMap

自定义函数必须在文件导入之前加入,否则会出错,因为这个纠结了很久,都是因为不熟悉api

t = template.New("test")
t.Funcs(template.FuncMap{"add": Add}) // 一定要在加载文件之前
t.ParseGlob("*.tpl")

4.编写简单引入

在template_test.tpl写入

{{define "getName"}}
    select * from name where name={{.Name}} and age={{.Age}}
{{end}}

define用作子模块,可以用于dao里面的各个方法命名,同一个文件表达一个dao全部方法

golang进行引入执行

func GetName() {
    fmt.Println(t.Name())
    user := &User{Name: "test", Age: 12}
    t.ExecuteTemplate(os.Stdout, "getName", user)
}

输出select * from name where name=test and age=12

5.编写循环与自定义add方法使用

在template_test.tpl写入

{{define "getNames"}}
    select * from name where 1=1 {{with .Name}}and name={{.}}{{end}} {{with .Ids}}{{range .}} and id={{.}}{{end}} {{end}}
    {{add 1 2}}
{{end}}

注意上面使用了with 后续表示检验是否为空的值直接使用{{.}}

add方法在上面添加自定义函数时候已经引入,下面把定义的函数,与处理其他代码写下

func Add(a int, b int) int {
    return a + b
}
type IDData struct {
    Name interface{}
    Ids  []int
}

func GetNames() {
    fmt.Println(t.Name())
    data := &IDData{Name: "test", Ids: nil}
    err := t.ExecuteTemplate(os.Stdout, "getNames", data)
    if err != nil {
        fmt.Println(err)
    }
}

6.其他内置的一些函数

在template_test.tpl写入

{{define "funcAction"}}
    {{if eq .a 0}}a=0{{else}}a=1{{end}}
    {{if eq .b 0}}b=0{{else if eq .b 1}}b=1{{else}}b={{.b}}{{end}}
    {{if or (eq .a 0) (eq .b 2)}}true{{else}}false{{end}}
    {{if and (eq .a 0) (eq .b 2)}}true{{else}}false{{end}}
{{end}}

上面主要有使用了if eq or and

golang代码

func FuncAction() {
    data := make(map[string]interface{})
    data["a"] = 1
    data["b"] = 2
    if err := t.ExecuteTemplate(os.Stdout, "funcAction", data); err != nil {
        fmt.Println("error", err)
    }
}

最后把测试代码贴下 自己也用作参考

go_template.go

package template

import (
    "bytes"
    "fmt"
    "html/template"
    "os"
)

var t *template.Template

type User struct {
    Name string
    Age  uint
}

func init() {
    //t, _ = template.ParseFiles("template_test.tpl")
    t = template.New("test")
    t.Funcs(template.FuncMap{"add": Add}) // 一定要在加载文件之前
    t.ParseGlob("*.tpl")
}

func Add(a int, b int) int {
    return a + b
}

func GetName() {
    fmt.Println(t.Name())
    user := &User{Name: "test", Age: 12}
    t.ExecuteTemplate(os.Stdout, "getName", user)
}

type IDData struct {
    Name interface{}
    Ids  []int
}

func GetNames() {
    fmt.Println(t.Name())
    data := &IDData{Name: "test", Ids: nil}
    err := t.ExecuteTemplate(os.Stdout, "getNames", data)
    if err != nil {
        fmt.Println(err)
    }
}

func InsertName() {
    fmt.Println(t.Name())
    user := &User{Name: "test", Age: 14}
    buf := new(bytes.Buffer)
    t.ExecuteTemplate(buf, "insertName", user)
    sql := buf.String()
    fmt.Println("InsertName_sql:", sql)
}

func GetNameTwo() {
    fmt.Println(t.Name())
    user := &User{Name: "test", Age: 12}
    t.ExecuteTemplate(os.Stdout, "getName1", user)
}

func InsertNameTwo() {
    fmt.Println(t.Templates()[0].Name())
    user := &User{Name: "test", Age: 14}
    buf := new(bytes.Buffer)
    t.ExecuteTemplate(buf, "insertName1", user)
    sql := buf.String()
    fmt.Println("InsertName_sql:", sql)
}

func FuncAction() {
    data := make(map[string]interface{})
    data["a"] = 1
    data["b"] = 2
    if err := t.ExecuteTemplate(os.Stdout, "funcAction", data); err != nil {
        fmt.Println("error", err)
    }
}

go_template_test.go

package template

import "testing"

func TestGetName(t *testing.T) {
    GetName()
}

func TestInsertName(t *testing.T) {
    InsertName()
}

func TestGetNameTwo(t *testing.T) {
    GetNameTwo()
}

func TestInsertNameTwo(t *testing.T) {
    InsertNameTwo()
}

func TestGetNames(t *testing.T) {
    GetNames()
}

func TestFuncAction(t *testing.T) {
    FuncAction()
}

template_test.tpl

{{define "getName"}}
    select * from name where name={{.Name}} and age={{.Age}}
{{end}}

{{define "insertName"}}
    insert into name (name,age) values ({{.Name}},{{.Age}})
{{end}}

{{define "getNames"}}
    select * from name where 1=1 {{with .Name}}and name={{.}}{{end}} {{with .Ids}}{{range .}} and id={{.}}{{end}} {{end}}
    {{add 1 2}}
{{end}}

{{define "funcAction"}}
    {{if eq .a 0}}a=0{{else}}a=1{{end}}
    {{if eq .b 0}}b=0{{else if eq .b 1}}b=1{{else}}b={{.b}}{{end}}
    {{if or (eq .a 0) (eq .b 2)}}true{{else}}false{{end}}
    {{if and (eq .a 0) (eq .b 2)}}true{{else}}false{{end}}
{{end}}

template_test1.tpl

{{define "getName1"}}
    select * from name1 where name={{.Name}} and age={{.Age}}
{{end}}

{{define "insertName1"}}
    insert into name1 (name,age) values ({{.Name}},{{.Age}})
{{end}}

以上所述就是小编给大家介绍的《golang template 用作类似mybatis前期一些准备》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

数字麦克卢汉

数字麦克卢汉

(美)保罗﹒莱文森(Paul Levinson) / 何道宽 / 社会科学文献出版社 / 2001年 / 20.0

本书是一本三合一的书。既是麦克卢汉评传,又是一部专著,而且是让网民“扫盲”和提高的指南。 《数字麦克卢汉》实际上有两个平行的主题和任务。一个是批评和张扬麦克卢汉。另一个是写作者自己的思想。它“不仅谋求提供进入数字时代的向导……而且谋求证明麦克卢汉思想隐而不显的准确性。为了完成这个双重任务,本书的每一章都试图阐明麦克卢汉的一种重要的洞见、原则或概念。与此同时,它试图揭示麦克卢汉告诉我们一些什么......一起来看看 《数字麦克卢汉》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试