GoFrame gset使用技巧总结 | 出栈、子集判断、序列化、遍历修改

语言: CN / TW / HK

highlight: a11y-dark theme: smartblue


持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第13天,点击查看活动详情

前言摘要

上一篇文章:GoFrame gset使用入门 | 对比PHP、Java、Redis 得到了大家不错的反馈,今天继续为大家分享gset的更多知识点。

随机出栈Pop

gset支持Pop()方法,随机出栈一个元素

也支持Pops()方法,随机出栈指定数量的元素

小技巧

GoFrame很多数据类型都支持出栈,要区分是随机出栈还是按顺序出栈的技巧如下:

如果是Pop()方法是随机出栈,比如:gset

如果是PopLeft()PopRights()这类方法是指定顺序出栈的,比如:garray

```go package main

import ( "fmt" "github.com/gogf/gf/container/gset" )

//出栈测试 func main() { var s gset.Set s.Add(1, 2, 3, 4) fmt.Println(s.Pop()) fmt.Println(s.Pops(2)) } ```

打印结果

我们发现每次打印结果都不一样: 说明Pop()是随机出栈的,popleft这种方法是按顺序出栈的

image.png

子集判断

另外一个好用的方法就是子集判断了:IsSubsetOf

```go package main

import ( "fmt" "github.com/gogf/gf/container/gset" )

//子集判断 func main() { s1 := gset.NewFrom([]interface{}{1, 2, 3}) s2 := gset.NewFrom([]interface{}{1, 2, 3, 4}) fmt.Println("s1是s2的子集吗?", s1.IsSubsetOf(s2)) //true fmt.Println("s2是s1的子集吗?", s2.IsSubsetOf(s1)) //false } ```

打印结果

image.png

序列化

使用技巧

  1. 如果需求是不可重复值,或者需要用交差并补集时,可以设置数据类型为gset类型:gset.Set
  2. 反序列化时,第二个参数必须是指针类型

```go package main

import ( "encoding/json" "fmt" "github.com/gogf/gf/container/gset" )

func main() { type Student struct { Name string Age int Score *gset.Set //如果需求是不可重复值,或者需要用交差并补集时,建议使用gset类型 } s1 := Student{ Name: "王中阳", Age: 18, Score: gset.NewFrom([]interface{}{100, 98, 98}), }

res, _ := json.Marshal(s1) fmt.Println("序列化结果:", string(res)) //序列化结果:{"Name":"王中阳","Age":18,"Score":[100,98]} 98重复,只生效了一个98 set不允许重复元素

// 反序列化 data := []byte({"Name":"王中阳","Age":18,"Score":[100,98]}) s2 := Student{} _ = json.Unmarshal(data, &s2) //第二个参数必须是指针类型 fmt.Println("反序列化:", s2) } ```

打印结果

通过打印结果我们发现:

序列化结果我们发现在定义的时候虽然设置了两个98,但是只生效了一个98,原因是set不允许重复元素。

image.png

遍历修改 walk

使用技巧

  1. gf提供的数据类型,只要支持walk方法,都表示支持遍历修改
  2. 遍历修改赋值是非常好用的处理数据的方式

```go package main

import ( "fmt" "github.com/gogf/gf/container/gset" "github.com/gogf/gf/frame/g" "github.com/gogf/gf/util/gconv" )

func main() { var ( s gset.Set tables = g.Slice{"user", "user_goods"} prefix = "my_" ) s.Add(tables...) fmt.Println("walk遍历修改前:", s.Slice()) s.Walk(func(item interface{}) interface{} { return prefix + gconv.String(item) }) fmt.Println("walk遍历修改后:", s.Slice()) } ```

打印结果

image.png

总结

这篇文章为大家分享了gset的使用技巧:出栈;也对比了哪些数据类型支持随机出栈,哪些支持指定顺序出栈;子集判断、序列化需要注意的问题、遍历修改walk的用法。

大家还有什么使用技巧,欢迎在评论区留言。

最后

感谢阅读,欢迎大家三连:点赞、收藏、~~投币~~(关注)!!!

8e95dac1fd0b2b1ff51c08757667c47a.gif