Skip to content
/ zstr Public
forked from zlyuancn/zstr

字符串工具, 模板渲染, 动态sql

Notifications You must be signed in to change notification settings

Golangltd/zstr

 
 

Repository files navigation

字符串工具, 模板渲染, 动态sql



字符串工具

// 转为zstr.String类型
s := zstr.String("1")

转为指定类型

s.String()      // 获取string
s.GetBool()     // 获取bool
s.GetInt()      // 获取int
s.GetInt32()    // 获取int32
s.GetUint64()   // 获取uint64
s.GetFloat32()  // 获取float32
s.Get...

扫描到变量

输出变量不支持切片,数组,map,struct

var a float64
var b uint32
var c bool
var d string
_ = s.Scan(&a)
_ = s.Scan(&b)
_ = s.Scan(&c)
_ = s.Scan(&d)

转换函数

输出变量不支持切片,数组,map,struct

zstr.GetString(1)       // 1
zstr.GetBool(1)         // true
zstr.GetInt(true)       // 1
zstr.GetFloat32("3.2")  // 3.2
zstr.Get...

Boolean支持

# 能转为true的数据
1, t, T, true, TRUE, True, y, Y, yes, YES, Yes, on, ON, On, ok, OK, Ok, enabled, ENABLED, Enabled
# 能转为false数据
nil, 0, f, F, false, FALSE, False, n, N, no, NO, No, off, OFF, Off, disable, DISABLE, Disable

扫描函数

输出变量不支持切片,数组,map,struct

将字符串扫描到指定变量

var a float64
var b uint32
var c bool
var d string
zstr.Scan("1", &a)  // 1
zstr.Scan("1", &b)  // 1
zstr.Scan("1", &c)  // true
zstr.Scan("1", &d)  // 1

将任何值扫描到指定变量

var a float64
var b uint32
var c bool
var d string
zstr.ScanAny(true, &a)     // 1
zstr.ScanAny(false, &b)    // 0
zstr.ScanAny("ok", &c)     // true
zstr.ScanAny(1.23, &d)     // 1.23

模板渲染

示例

Render("s@a e", map[string]string{"a": "va"})
Render("s{@a}e", map[string]string{"a": "va"})
Render("s{@a}e", "va")
Render("s@a @a e", "va0", "va1")

变量名

模板变量用 @ 开头, 变量名支持 大小写字母; 数字; 下划线; 小数点;
模板变量可以使用花括号`{}`包起来, 这样能精确的界定模板变量的开头和结尾. 注意花括号内不能有空格.
示例:
    @a
    @a_b
    @A.c
    {@a....c}
    {@9}
    @0...A

模板渲染说明

func Render(format string, values ...interface{}) string
// format表示要进行渲染的文本
// values表示变量值

变量名匹配

变量名带下标, 下标从0开始, 如: a[0]表示第一次出现的a, a[5]表示第6次出现的a.
和变量名相等, 如: a;  a_b;  A.c;  a....c;  9;  0...A
星号*可以匹配任何变量名, 但是必须和下标一起使用, 下标从0开始, 如: *[0]表示1个变量, *[5]表示第6个变量.

变量名匹配优先级

  1. 变量名带下标
  2. 变量名
  3. 星号带下标

参考 MakeMapOfValues

支持任何类型的map, 如 map[string]interface{}; map[int]int, map[string]int 等.
传参时支持顺序传值, 如 Render("要渲染的文本", 值0, 值1, 值2), 它会转为以下描述
    map[string]interface{}{"*[0]": 值0, "*[1]", 值1, "*[2]", 值2}

渲染

模板渲染时遍历找出所有模板变量, 然后替换为匹配的变量值.
如果模板变量未赋值则不会替换, 但是如果模板变量是被花括号`{}`包起来的, 会替换为空字符串.

动态sql

你是否会有根据不同的条件拼接不同的sql语句的痛苦, 使用 zstr动态sql 一次根治

示例

zstr.SqlRender("select * from table where &a (&b |c)", map[string]interface{}{
    "a": 1,
    "b": 2,
    "c": 3,
})

模板语法说明

语法格式如下:
    (操作符)(变量名)
    {(操作符)(变量名)}
    {(操作符)(变量名) (标记)}
    {(操作符)(变量名) (标记) (选项)}
    {(操作符)(变量名) (选项)}
示例:
    &a
    {&a}
    {&a like}
    {&a like d}
    {&a d}

操作符

  • & 转为 and 变量名 标记 值

  • | 转为 or 变量名 标记 值

  • # 转为

    自带 attention 选项
    
  • @ 转为 , 一般用于写入一条语句

    attention 选项无效
    自带 direct 选项, 不会为字符串加上引号
    

变量名

模板变量用一个 操作符 开头. 变量名支持: 下划线; 大小写字母; 数字; 小数点
模板变量可以使用花括号`{}`包起来, 这样能精确的界定模板变量的开头和结尾. 花括号内允许有空格
示例:
    &a
    |a_b
    #A.c
    {&a....c}
    {@9}
    @0...A

标记

默认标记为 =

>
>=
<
<=
!=  <>
=
in
not_in  notin
like
like_start  likestart
like_end  likeend

选项

  • attention, 语法 a, 不会忽略参数值为该类型的零值
  • direct, 语法 d, 直接将值写入sql语句中
  • must, 语法 m, 必须传值

模板渲染说明

func SqlRender(sql_template string, values ...interface{}) string
// sql_template表示要进行渲染的sql
// values表示变量值

变量名匹配

变量名带下标, 下标从0开始, 如: a[0]表示第一次出现的a, a[5]表示第6次出现的a.
和变量名相等, 如: a;  a_b;  A.c;  a....c;  9;  0...A
星号*可以匹配任何变量名, 但是必须和下标一起使用, 下标从0开始, 如: *[0]表示1个变量, *[5]表示第6个变量.

变量名匹配优先级

  1. 变量名带下标
  2. 变量名
  3. 星号带下标

参考 MakeMapOfValues

支持任何类型的map, 如 map[string]interface{}; map[int]int, map[string]int 等.
传参时支持顺序传值, 如 Render("要渲染的文本", 值0, 值1, 值2), 它会转为以下描述
    map[string]interface{}{"*[0]": 值0, "*[1]", 值1, "*[2]", 值2}

渲染

渲染文本之前会缩进文本所有的空格, 所以要渲染的文本一般为单纯的sql语句, 不要将值写在文本中, 而是使用传参的概念, 这是使用sql的标准姿势

模板渲染时遍历找出所有模板语法, 然后按语法替换为不同的值.
一般情况下如果变量没有传参或为该类型的零值, 则替换为空字符串.
如果变量的值为nil, 不同的标志会转为不同的语句.

模板渲染和动态sql性能说明

我们写了一个专用函数用于替换正则查找规则, 经过Benchmark测试, 速度为正则查找变量方式的230%!!!
具体的性能可以将代码clone后执行以下命令
    go test -v -bench .

About

字符串工具, 模板渲染, 动态sql

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Go 100.0%