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

1,974 阅读3分钟

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

前言摘要

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

随机出栈Pop

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

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

小技巧

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

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

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

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

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. 反序列化时,第二个参数必须是指针类型
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. 遍历修改赋值是非常好用的处理数据的方式
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