字符串处理工具类
func TestStr(t *testing.T) {
p := fmt.Println
p("Contains: ", gstr.Contains("test", "es"))
p("Count: ", gstr.Count("test", "t"))
p("HasPrefix: ", gstr.HasPrefix("test", "te"))
p("HasSuffix: ", gstr.HasSuffix("test", "st"))
p("Join: ", gstr.Join([]string{"a", "b"}, "-"))
p("Repeat: ", gstr.Repeat("a", 5))
p("Replace: ", gstr.Replace("foo", "o", "0", -1))
p("Replace: ", gstr.Replace("foo", "o", "0", 1))
p("Split: ", gstr.Split("a-b-c-d-e", "-"))
p("ToLower: ", gstr.ToLower("TEST"))
p("ToUpper: ", gstr.ToUpper("test"))
p("Trim: ", gstr.Trim(" test "))
}
g.Map实现type Map = map[string]interface{}
支持并发安全开关选项的map
容器,最常用的数据结构。
该模块包含多个数据结构的map
容器:HashMap
、TreeMap
和ListMap
。
类型 | 数据结构 | 平均复杂度 | 支持排序 | 有序遍历 | 说明 |
---|---|---|---|---|---|
HashMap |
哈希表 | O(1) | 否 | 否 | 高性能读写操作,内存占用较高,随机遍历 |
ListMap |
哈希表+双向链表 | O(2) | 否 | 是 | 支持按照写入顺序遍历,内存占用较高 |
TreeMap |
红黑树 | O(log N) | 是 | 是 | 内存占用紧凑,支持键名排序及有序遍历 |
此外,
gmap
模块支持多种以哈希表为基础数据结构的常见类型map
定义:IntIntMap
、IntStrMap
、IntAnyMap
、StrIntMap
、StrStrMap
、StrAnyMap
。
使用场景:
任何map
/哈希表/关联数组使用场景,尤其是并发安全场景中。
func TestMap(t *testing.T) {
p := fmt.Println
// 常规map方法
// 初始化
m2 := g.Map{"a": 1, "b": 2}
p(m2)
// 设置
m2["c"] = 25
p(m2)
// 获取
p(m2["b"])
// 删除
delete(m2, "c")
// 遍历
for k, v := range m2 {
p(k, v)
}
p("###########################")
// 创建一个默认的gmap对象,
// 默认情况下该gmap对象不支持并发安全特性,
// 初始化时可以给定true参数开启并发安全特性。
m := gmap.New()
// 设置键值对
for i := 0; i < 10; i++ {
m.Set(i, i)
}
// 查询大小
p(m.Size())
// 批量设置键值对(不同的数据类型对象参数不同)
m.Sets(map[interface{}]interface{}{
10: 10,
11: 11,
})
p(m.Size())
// 查询是否存在
p(m.Contains(1))
// 查询键值
p(m.Get(1))
// 删除数据项
m.Remove(9)
p(m.Size())
// 批量删除
m.Removes([]interface{}{10, 11})
p(m.Size())
// 当前键名列表(随机排序)
p(m.Keys())
// 当前键值列表(随机排序)
p(m.Values())
// 查询键名,当键值不存在时,写入给定的默认值
p(m.GetOrSet(100, 100))
// 删除键值对,并返回对应的键值
p(m.Remove(100))
// 遍历map
m.Iterator(func(k interface{}, v interface{}) bool {
fmt.Printf("%v:%v ", k, v)
return true
})
// 清空map
m.Clear()
// 判断map是否为空
p(m.IsEmpty())
}
gjson
模块实现了强大的JSON
编码/解析,支持数据层级检索、动态创建修改Json
对象,并支持常见数据格式的解析和转换等特点。
func TestJson(t *testing.T) {
p := fmt.Println
// 创建json
jsonContent := `{"name":"john", "score":"100"}`
j := gjson.New(jsonContent)
p(j.Get("name"))
p(j.Get("score"))
// 创建json
j2 := gjson.New(nil)
j2.Set("name", "John")
j2.Set("score", 99.5)
fmt.Printf(
"Name: %s, Score: %v\n",
j2.Get("name").String(),
j2.Get("score").Float64(),
)
p(j2.MustToJsonString())
// struct转json
type Me struct {
Name string `json:"name"`
Score int `json:"score"`
}
me := Me{
Name: "john",
Score: 100,
}
j3 := gjson.New(me)
p(j3.Get("name"))
p(j3.Get("score"))
// 转换回Struct
Me2 := new(Me)
if err := j.Scan(Me2); err != nil {
panic(err)
}
fmt.Printf(`%+v`, Me2)
p()
// 格式转换
p("JSON:")
p(j3.MustToJsonString())
p("======================")
p("XML:")
p(j3.MustToXmlString("document"))
p("======================")
p("YAML:")
p(j3.MustToYamlString())
p("======================")
p("TOML:")
p(j3.MustToTomlString())
}
MD5算法
func TestMd5(t *testing.T) {
p := fmt.Println
// md5加密
p(gmd5.MustEncrypt("123456"))
}
gf
框架提供了非常强大的类型转换包gconv
,可以实现将任何数据类型转换为指定的数据类型,对常用基本数据类型之间的无缝转换,同时也支持任意类型到struct
对象的转换。由于gconv
模块内部大量使用了断言而非反射(仅struct
转换使用到了反射),因此执行的效率非常高。
gconv.Map
支持将任意的map
或struct
/*struct
类型转换为常用的 map[string]interface{}
类型。当转换参数为struct
/*struct
类型时,支持自动识别struct
的 c/gconv/json
标签,并且可以通过Map
方法的第二个参数tags
指定自定义的转换标签,以及多个标签解析的优先级。如果转换失败,返回nil
。
属性标签:当转换
struct
/*struct
类型时,c/gconv/json
标签,也支持-
及omitempty
标签属性。当使用-
标签属性时,表示该属性不执行转换;当使用omitempty
标签属性时,表示当属性为空时(空指针nil
, 数字0
, 字符串""
, 空数组[]
等)不执行转换。具体请查看随后示例。
项目中我们经常会遇到大量struct
的使用,以及各种数据类型到struct
的转换/赋值(特别是json
/xml
/各种协议编码转换的时候)。为提高编码及项目维护效率,gconv
模块为各位开发者带来了极大的福利,为数据解析提供了更高的灵活度。
func TestConv(t *testing.T) {
i := 123.456
fmt.Printf("%10s %v\n", "Int:", gconv.Int(i))
fmt.Printf("%10s %v\n", "Int8:", gconv.Int8(i))
fmt.Printf("%10s %v\n", "Int16:", gconv.Int16(i))
fmt.Printf("%10s %v\n", "Int32:", gconv.Int32(i))
fmt.Printf("%10s %v\n", "Int64:", gconv.Int64(i))
fmt.Printf("%10s %v\n", "Uint:", gconv.Uint(i))
fmt.Printf("%10s %v\n", "Uint8:", gconv.Uint8(i))
fmt.Printf("%10s %v\n", "Uint16:", gconv.Uint16(i))
fmt.Printf("%10s %v\n", "Uint32:", gconv.Uint32(i))
fmt.Printf("%10s %v\n", "Uint64:", gconv.Uint64(i))
fmt.Printf("%10s %v\n", "Float32:", gconv.Float32(i))
fmt.Printf("%10s %v\n", "Float64:", gconv.Float64(i))
fmt.Printf("%10s %v\n", "Bool:", gconv.Bool(i))
fmt.Printf("%10s %v\n", "String:", gconv.String(i))
fmt.Printf("%10s %v\n", "Bytes:", gconv.Bytes(i))
fmt.Printf("%10s %v\n", "Strings:", gconv.Strings(i))
fmt.Printf("%10s %v\n", "Ints:", gconv.Ints(i))
fmt.Printf("%10s %v\n", "Floats:", gconv.Floats(i))
fmt.Printf("%10s %v\n", "Interfaces:", gconv.Interfaces(i))
fmt.Println("##############")
// struct和map转换
type User struct {
Uid int `c:"uid"`
Name string `c:"name"`
}
// 对象
m := gconv.Map(User{
Uid: 1,
Name: "john",
})
fmt.Println(m)
fmt.Println("##############")
user := (*User)(nil)
err := gconv.Struct(m, &user)
if err != nil {
panic(err)
}
g.Dump(user)
}
- QQ交流群:116707870
- WX交流群:微信添加
389961817
备注GF
加群