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 在设计时考虑了性能因素:
- 尽量减少内存分配
- 使用泛型避免类型断言
- 提供链式调用但避免过度嵌套
- 对于大数据集,建议使用原生操作
总结
go-array 提供了以下优势:
- 更简洁的集合操作语法
- 丰富的实用函数
- 统一的API风格
- 良好的类型安全
- 方便的JSON处理
对于简单的数据处理任务,这个库可以显著减少样板代码。但对于性能关键路径,建议还是使用原生操作。
希望这个介绍对您有帮助!如需更详细的使用方法,可以参考项目的GitHub文档。