1 Star 0 Fork 25

mkxue / gfstudy

forked from goflyfox / gfstudy 
加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
10.goframe常用工具介绍.md 7.67 KB
一键复制 编辑 原始数据 按行查看 历史
zcool321@sina.com 提交于 2020-03-24 01:19 . update doc

Goframe常用工具介绍

一、gstr字符串处理

字符串处理工具类

示例

	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和gmap

g.Map实现type Map = map[string]interface{}

支持并发安全开关选项的map容器,最常用的数据结构。

该模块包含多个数据结构的map容器:HashMapTreeMapListMap

类型 数据结构 平均复杂度 支持排序 有序遍历 说明
HashMap 哈希表 O(1) 高性能读写操作,内存占用较高,随机遍历
ListMap 哈希表+双向链表 O(2) 支持按照写入顺序遍历,内存占用较高
TreeMap 红黑树 O(log N) 内存占用紧凑,支持键名排序及有序遍历

此外,gmap模块支持多种以哈希表为基础数据结构的常见类型map定义:IntIntMapIntStrMapIntAnyMapStrIntMapStrStrMapStrAnyMap

使用场景

任何map/哈希表/关联数组使用场景,尤其是并发安全场景中。

示例

	// 常规map方法
	p := fmt.Println
	// 初始化
	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)
	}
	// 查询大小
	fmt.Println(m.Size())
	// 批量设置键值对(不同的数据类型对象参数不同)
	m.Sets(map[interface{}]interface{}{
		10: 10,
		11: 11,
	})
	fmt.Println(m.Size())
	// 查询是否存在
	fmt.Println(m.Contains(1))
	// 查询键值
	fmt.Println(m.Get(1))
	// 删除数据项
	m.Remove(9)
	fmt.Println(m.Size())
	// 批量删除
	m.Removes([]interface{}{10, 11})
	fmt.Println(m.Size())
	// 当前键名列表(随机排序)
	fmt.Println(m.Keys())
	// 当前键值列表(随机排序)
	fmt.Println(m.Values())
	// 查询键名,当键值不存在时,写入给定的默认值
	fmt.Println(m.GetOrSet(100, 100))
	// 删除键值对,并返回对应的键值
	fmt.Println(m.Remove(100))
	// 遍历map
	m.Iterator(func(k interface{}, v interface{}) bool {
		fmt.Printf("%v:%v ", k, v)
		return true
	})
	// 清空map
	m.Clear()
	// 判断map是否为空
	fmt.Println(m.IsEmpty())

三、gjson

gjson模块实现了强大的JSON编码/解析,支持数据层级检索、动态创建修改Json对象,并支持常见数据格式的解析和转换等特点。

示例

    // 创建json
	jsonContent := `{"name":"john", "score":"100"}`
	j := gjson.New(jsonContent)
	fmt.Println(j.Get("name"))
	fmt.Println(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.GetString("name"),
		j2.GetFloat32("score"),
	)
	fmt.Println(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)
	fmt.Println(j3.Get("name"))
	fmt.Println(j3.Get("score"))
	// 转换回Struct
	Me2 := new(Me)
	if err := j.ToStruct(Me2); err != nil {
		panic(err)
	}
	fmt.Printf(`%+v`, Me2)
	fmt.Println()

	// 格式转换
	fmt.Println("JSON:")
	fmt.Println(j3.MustToJsonString())
	fmt.Println("======================")

	fmt.Println("XML:")
	fmt.Println(j3.MustToXmlString("document"))
	fmt.Println("======================")

	fmt.Println("YAML:")
	fmt.Println(j3.MustToYamlString())
	fmt.Println("======================")

	fmt.Println("TOML:")
	fmt.Println(j3.MustToTomlString())

四、gmd5

MD5算法

示例

	p := fmt.Println
	// md5加密
	p(gmd5.MustEncrypt("123456"))

五、类型转换

gconv

gf框架提供了非常强大的类型转换包gconv,可以实现将任何数据类型转换为指定的数据类型,对常用基本数据类型之间的无缝转换,同时也支持任意类型到struct对象的转换。由于gconv模块内部大量使用了断言而非反射(仅struct转换使用到了反射),因此执行的效率非常高。

Map转换

gconv.Map支持将任意的mapstruct/*struct类型转换为常用的 map[string]interface{} 类型。当转换参数为struct/*struct类型时,支持自动识别structc/gconv/json 标签,并且可以通过Map方法的第二个参数tags指定自定义的转换标签,以及多个标签解析的优先级。如果转换失败,返回nil

属性标签:当转换struct/*struct类型时, c/gconv/json 标签,也支持 -omitempty 标签属性。当使用 - 标签属性时,表示该属性不执行转换;当使用 omitempty 标签属性时,表示当属性为空时(空指针nil, 数字0, 字符串"", 空数组[]等)不执行转换。具体请查看随后示例。

Struct转换

项目中我们经常会遇到大量struct的使用,以及各种数据类型到struct的转换/赋值(特别是json/xml/各种协议编码转换的时候)。为提高编码及项目维护效率,gconv模块为各位开发者带来了极大的福利,为数据解析提供了更高的灵活度。

示例

	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)

六、GF交流

  • QQ交流群:116707870
  • WX交流群:微信添加389961817备注GF加群
1
https://gitee.com/mkxue/gfstudy.git
git@gitee.com:mkxue/gfstudy.git
mkxue
gfstudy
gfstudy
master

搜索帮助