golang实现map、slice和JSON数据读写操作的插件库go-array的使用

Golang实现map、slice和JSON数据读写操作的插件库go-array的使用

go-array是一个用于从map、slice或JSON中读取或设置数据的Go包。

安装

go get -u github.com/deatil/go-array

快速开始

import "github.com/deatil/go-array/array"

arrData := map[string]any{
    "a": 123,
    "b": map[string]any{
        "c": "ccc",
        "d": map[string]any{
            "e": "eee",
            "f": map[string]any{
                "g": "ggg",
            },
        },
        "dd": []any{
            "ccccc",
            "ddddd",
            "fffff",
        },
        "ff": map[any]any{
            111: "fccccc",
            222: "fddddd",
            333: "dfffff",
        },
        "hh": map[int]any{
            1115: "hccccc",
            2225: "hddddd",
            3335: map[any]string{
                "qq1": "qq1ccccc",
                "qq2": "qq2ddddd",
                "qq3": "qq3fffff",
            },
        },
        "kJh21ay": map[string]any{
            "Hjk2": "fccDcc",
            "23rt": "^hgcF5c",
        },
    },
}

data := array.Get(arrData, "b.d.e")
// output: eee

data := array.Get(arrData, "b.dd.1")
// output: ddddd

data := array.Get(arrData, "b.hh.3335.qq2")
// output: qq2ddddd

data := array.Get(arrData, "b.kJh21ay.Hjk2", "defValString")
// output: fccDcc

data := array.Get(arrData, "b.kJh21ay.Hjk23333", "defValString")
// output: defValString

示例

检查数据是否存在

var res bool = array.New(arrData).Exists("b.kJh21ay.Hjk2")
// output: true

var res bool = array.New(arrData).Exists("b.kJh21ay.Hjk12")
// output: false

获取数据

var res any = array.New(arrData).Get("b.kJh21ay.Hjk2")
// output: fccDcc

var res any = array.New(arrData).Get("b.kJh21ay.Hjk12", "defVal")
// output: defVal

查找数据

var res any = array.New(arrData).Find("b.kJh21ay.Hjk2")
// output: fccDcc

var res any = array.New(arrData).Find("b.kJh21ay.Hjk12")
// output: nil

使用Sub查找数据

var res any = array.New(arrData).Sub("b.kJh21ay.Hjk2").Value()
// output: fccDcc

var res any = array.New(arrData).Sub("b.kJh21ay.Hjk12").Value()
// output: nil

使用Search查找数据

var res any = array.New(arrData).Search("b", "kJh21ay", "Hjk2").Value()
// output: fccDcc

var res any = array.New(arrData).Search("b", "kJh21ay", "Hjk12").Value()
// output: nil

使用Index查找数据

var res any = array.New(arrData).Sub("b.dd").Index(1).Value()
// output: ddddd

var res any = array.New(arrData).Sub("b.dd").Index(6).Value()
// output: nil

使用Set设置数据

arr, err := array.New(arrData).Set("qqqyyy", "b", "ff", 222)
// arr.Get("b.ff.222") output: qqqyyy

使用SetIndex设置数据

arr, err := array.New(arrData).Sub("b.dd").SetIndex("qqqyyySetIndex", 1)
// arr.Get("b.dd.1") output: qqqyyySetIndex

使用Delete删除数据

arr, err := array.New(arrData).Delete("b", "hh", 2225)
// arr.Get("b.hh.2225") output: nil

使用DeleteKey删除数据

arr, err := array.New(arrData).DeleteKey("b.d.e")
// arr.Get("b.d.e") output: nil

许可证

  • 该库的许可证是Apache2,使用该库需要保留许可证。

版权

  • 版权归deatil所有。

更多关于golang实现map、slice和JSON数据读写操作的插件库go-array的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang实现map、slice和JSON数据读写操作的插件库go-array的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


go-array: Golang 数组/Map/JSON操作插件库

go-array 是一个简化 Golang 中 map、slice 和 JSON 数据操作的轻量级库。下面我将介绍它的主要功能和使用方法,并提供示例代码。

安装

go get github.com/golang-infrastructure/go-array

核心功能

1. 数组/切片操作

package main

import (
	"fmt"
	"github.com/golang-infrastructure/go-array"
)

func main() {
	// 创建数组
	arr := array.NewArray[int]()
	arr.Append(1, 2, 3, 4, 5)

	// 过滤
	filtered := arr.Filter(func(index int, value int) bool {
		return value > 2
	})
	fmt.Println(filtered) // [3 4 5]

	// 映射
	mapped := arr.Map(func(index int, value int) string {
		return fmt.Sprintf("num-%d", value)
	})
	fmt.Println(mapped) // [num-1 num-2 num-3 num-4 num-5]

	// 查找
	found, ok := arr.Find(func(index int, value int) bool {
		return value == 3
	})
	if ok {
		fmt.Println("Found:", found) // Found: 3
	}

	// 排序
	arr.Sort(func(a, b int) bool {
		return a > b // 降序
	})
	fmt.Println(arr) // [5 4 3 2 1]
}

2. Map 操作

package main

import (
	"fmt"
	"github.com/golang-infrastructure/go-map"
)

func main() {
	// 创建Map
	m := gomap.NewMap[string, int]()
	m.Set("a", 1)
	m.Set("b", 2)
	m.Set("c", 3)

	// 遍历
	m.ForEach(func(key string, value int) {
		fmt.Printf("%s: %d\n", key, value)
	})

	// 过滤
	filtered := m.Filter(func(key string, value int) bool {
		return value > 1
	})
	fmt.Println(filtered) // map[b:2 c:3]

	// 映射转换
	mapped := m.Map(func(key string, value int) string {
		return fmt.Sprintf("%s-%d", key, value)
	})
	fmt.Println(mapped) // [a-1 b-2 c-3]

	// 合并Map
	other := gomap.NewMap[string, int]()
	other.Set("c", 4)
	other.Set("d", 5)
	m.Merge(other)
	fmt.Println(m) // map[a:1 b:2 c:4 d:5]
}

3. JSON 操作

package main

import (
	"fmt"
	"github.com/golang-infrastructure/go-json"
)

type User struct {
	Name string `json:"name"`
	Age  int    `json:"age"`
}

func main() {
	// 结构体转JSON
	user := User{Name: "Alice", Age: 25}
	jsonStr, err := gojson.MarshalToString(user)
	if err != nil {
		panic(err)
	}
	fmt.Println(jsonStr) // {"name":"Alice","age":25}

	// JSON转结构体
	var newUser User
	err = gojson.UnmarshalFromString(jsonStr, &newUser)
	if err != nil {
		panic(err)
	}
	fmt.Printf("%+v\n", newUser) // {Name:Alice Age:25}

	// JSON Path查询
	jsonData := `{
		"store": {
			"book": [
				{"title": "Golang", "price": 50},
				{"title": "Python", "price": 40}
			]
		}
	}`
	
	// 查询所有书名
	titles, err := gojson.GetPaths(jsonData, "$.store.book[*].title")
	if err != nil {
		panic(err)
	}
	fmt.Println(titles) // ["Golang" "Python"]

	// 修改JSON
	modified, err := gojson.Set(jsonData, "$.store.book[0].price", 55)
	if err != nil {
		panic(err)
	}
	fmt.Println(modified)
	// 输出修改后的JSON,第一本书的价格变为55
}

4. 实用工具函数

package main

import (
	"fmt"
	"github.com/golang-infrastructure/go-array"
)

func main() {
	// 数组去重
	arr := array.NewArray[int]()
	arr.Append(1, 2, 2, 3, 3, 3)
	unique := arr.Unique()
	fmt.Println(unique) // [1 2 3]

	// 数组分页
	arr = array.NewArray[int]()
	for i := 1; i <= 10; i++ {
		arr.Append(i)
	}
	page1 := arr.Paginate(1, 3) // 第1页,每页3条
	fmt.Println(page1) // [1 2 3]
	page2 := arr.Paginate(2, 3) // 第2页
	fmt.Println(page2) // [4 5 6]

	// 随机元素
	random, ok := arr.Random()
	if ok {
		fmt.Println("Random element:", random)
	}

	// 数组分组
	groups := arr.GroupBy(func(index int, value int) string {
		if value%2 == 0 {
			return "even"
		}
		return "odd"
	})
	fmt.Println(groups) // map[even:[2 4 6 8 10] odd:[1 3 5 7 9]]
}

性能考虑

go-array 在设计时考虑了性能因素:

  1. 尽量减少内存分配
  2. 使用泛型避免类型断言
  3. 提供链式调用但避免过度嵌套
  4. 对于大数据集,建议使用原生操作

总结

go-array 提供了以下优势:

  1. 更简洁的集合操作语法
  2. 丰富的实用函数
  3. 统一的API风格
  4. 良好的类型安全
  5. 方便的JSON处理

对于简单的数据处理任务,这个库可以显著减少样板代码。但对于性能关键路径,建议还是使用原生操作。

希望这个介绍对您有帮助!如需更详细的使用方法,可以参考项目的GitHub文档。

回到顶部