这里以StrSet类型介绍方法使用,其他集合类型的方法与此类似,不再赘述。

NewStrSet

  • 说明:NewStrSet创建并返回一个空的集合,其中包含没有重复字符串的数据。参数safe用于指定是否在并发安全中使用,默认情况下是false
  • 格式:

  • 示例:

    1. func ExampleNewStrSet() {
    2. strSet := gset.NewStrSet(true)
    3. strSet.Add([]string{"str1", "str2", "str3"}...)
    4. fmt.Println(strSet.Slice())
    5. // May Output:
    6. // [str3 str1 str2]
    7. }

NewStrSetFrom

  • 说明:NewStrSetFrom通过给定的数组创建集合集合。参数safe用于指定是否在并发安全中使用,默认情况下是false
  • 格式:

    1. func NewStrSetFrom(items []string, safe ...bool) *StrSet
  • 示例:

    1. func ExampleNewStrSetFrom() {
    2. strSet := gset.NewStrSetFrom([]string{"str1", "str2", "str3"}, true)
    3. fmt.Println(strSet.Slice())
    4. // May Output:
    5. // [str1 str2 str3]
    6. }

Add

  • 说明:Add添加一个或多个元素项到集合中。
  • 格式:

    1. func (set *StrSet) Add(item ...string)
  • 示例:

    1. func ExampleStrSet_Add() {
    2. strSet := gset.NewStrSetFrom([]string{"str1", "str2", "str3"}, true)
    3. strSet.Add("str")
    4. fmt.Println(strSet.Slice())
    5. fmt.Println(strSet.AddIfNotExist("str"))
    6. // Mya Output:
    7. // [str str1 str2 str3]
    8. // false
    9. }

AddIfNotExist

  • 说明:Addifnotexist检查集合中是否存在指定元素项item,如果不存在则将item添加到集合中并返回true,否则什么也不做并返回false
  • 格式:

    1. func (set *StrSet) AddIfNotExist(item string) bool
  • 示例:

    1. func ExampleStrSet_AddIfNotExist() {
    2. strSet := gset.NewStrSetFrom([]string{"str1", "str2", "str3"}, true)
    3. strSet.Add("str")
    4. fmt.Println(strSet.Slice())
    5. fmt.Println(strSet.AddIfNotExist("str"))
    6. // Mya Output:
    7. // [str str1 str2 str3]
    8. // false
    9. }

AddIfNotExistFunc

  • 说明: AddIfNotExistFunc检查集合中存在指定元素项item,如果不存在并且方法f返回true时,则将item设置到集合中并返回true,否则什么也不做并返回false
  • 格式:

    1. func (set *StrSet) AddIfNotExistFunc(item string, f func() bool) bool
  • 示例:

    1. func ExampleStrSet_AddIfNotExistFunc() {
    2. strSet := gset.NewStrSetFrom([]string{"str1", "str2", "str3"}, true)
    3. strSet.Add("str")
    4. fmt.Println(strSet.Slice())
    5. fmt.Println(strSet.AddIfNotExistFunc("str5", func() bool {
    6. return true
    7. }))
    8. // May Output:
    9. // [str1 str2 str3 str]
    10. // true
    11. }

AddIfNotExistFuncLock

  • 说明: AddifnotExistFuncLockAddIfNotExistFunc类似,不过当多个goroutine同时调用AddifnotExistFuncLock方法时,内部使用并发安全锁机制保证同时只能一个goroutine执行。该方法只有在创建集合时的safe参数设置true时有效,否则表现和方法一致AddIfNotExistFunc
  • 格式:

    1. func (set *StrSet) AddIfNotExistFuncLock(item string, f func() bool) bool
  • 示例:

    1. func ExampleStrSet_AddIfNotExistFuncLock() {
    2. strSet := gset.NewStrSetFrom([]string{"str1", "str2", "str3"}, true)
    3. strSet.Add("str")
    4. fmt.Println(strSet.Slice())
    5. fmt.Println(strSet.AddIfNotExistFuncLock("str4", func() bool {
    6. return true
    7. }))
    8. // May Output:
    9. // [str1 str2 str3 str]
    10. // true
    11. }

Clear

  • 说明:Clear 删除集合的所有元素项。
  • 格式:

    1. func (set *StrSet) Clear()
  • 示例:

    1. func ExampleStrSet_Clear() {
    2. strSet := gset.NewStrSetFrom([]string{"str1", "str2", "str3"}, true)
    3. fmt.Println(strSet.Size())
    4. strSet.Clear()
    5. fmt.Println(strSet.Size())
    6. // Output:
    7. // 3
    8. // 0
    9. }

Intersect

  • 说明:Intrersect 执行集合setothers的交集,并返回一个新的集合newSet,在newSet中的元素项同时存在于集合setothers中。
  • 格式:

    1. func (set *StrSet) Intersect(others ...*StrSet) (newSet *StrSet)
  • 示例:

    1. func ExampleStrSet_Intersect() {
    2. s1 := gset.NewStrSet(true)
    3. s1.Add([]string{"a", "b", "c"}...)
    4. var s2 gset.StrSet
    5. s2.Add([]string{"a", "b", "c", "d"}...)
    6. fmt.Println(s2.Intersect(s1).Slice())
    7. // May Output:
    8. // [c a b]
    9. }

Diff

  • 说明:Diff 执行集合setothers差集操作,并返回一个新的集合newSet。在newSet中的元素项存在于set但不存在于集合others。注意,参数others可以指定多个集合参数。
  • 格式:

    1. func (set *StrSet) Diff(others ...*StrSet) (newSet *StrSet)
  • 示例:

    1. s1 := gset.NewStrSetFrom([]string{"a", "b", "c"}, true)
    2. s2 := gset.NewStrSetFrom([]string{"a", "b", "c", "d"}, true)
    3. fmt.Println(s2.Diff(s1).Slice())
    4. // Output:
    5. // [d]
    6. }

Union

  • 说明:union执行集合setothers的并集操作,并返回一个新的集合newSet
  • 格式:

    1. func (set *StrSet) Union(others ...*StrSet) (newSet *StrSet)
    1. func ExampleStrSet_Union() {
    2. s1.Add([]string{"a", "b", "c", "d"}...)
    3. s2 := gset.NewStrSet(true)
    4. s2.Add([]string{"a", "b", "d"}...)
    5. fmt.Println(s1.Union(s2).Slice())
    6. // May Output:
    7. // [a b c d]
    8. }

Complement

  • 说明:Complement 执行setfull的补集操作,并返回一个新集合newSet
  • 格式:

  • 示例:

    1. func ExampleStrSet_Complement() {
    2. strSet := gset.NewStrSetFrom([]string{"str1", "str2", "str3", "str4", "str5"}, true)
    3. s := gset.NewStrSetFrom([]string{"str1", "str2", "str3"}, true)
    4. fmt.Println(s.Complement(strSet).Slice())
    5. // May Output:
    6. // [str4 str5]
    7. }

Contains

  • 说明:Contains 包含检查集是否包含item
  • 格式:

    1. func (set *StrSet) Contains(item string) bool
  • 示例:

    1. func ExampleStrSet_Contains() {
    2. var set gset.StrSet
    3. set.Add("a")
    4. fmt.Println(set.Contains("a"))
    5. fmt.Println(set.Contains("A"))
    6. // Output:
    7. // true
    8. // false
    9. }

ContainsI

  • 说明: ContainsI方法类似于Contains,只是它不区分大小写比较大小。
  • 格式:

    1. func (set *StrSet) ContainsI(item string) bool
  • 示例:

    1. func ExampleStrSet_ContainsI() {
    2. var set gset.StrSet
    3. set.Add("a")
    4. fmt.Println(set.ContainsI("a"))
    5. fmt.Println(set.ContainsI("A"))
    6. // Output:
    7. // true
    8. // true
    9. }

Equal

  • 说明: Equal检查两个集合是否完全相等(包括大小以及元素项)。
  • 格式:

    1. func (set *StrSet) Equal(other *StrSet) bool
  • 示例:

    1. func ExampleStrSet_Equal() {
    2. s1 := gset.NewStrSetFrom([]string{"a", "b", "c"}, true)
    3. s2 := gset.NewStrSetFrom([]string{"a", "b", "c", "d"}, true)
    4. fmt.Println(s2.Equal(s1))
    5. s3 := gset.NewStrSetFrom([]string{"a", "b", "c"}, true)
    6. s4 := gset.NewStrSetFrom([]string{"a", "b", "c"}, true)
    7. fmt.Println(s3.Equal(s4))
    8. // Output:
    9. // false
    10. // true
    11. }

IsSubSetOf

  • 说明:IsSumSetOf检查当前集合set是否是指定集合other的子集。
  • 格式:

    1. func (set *StrSet) IsSubsetOf(other *StrSet) bool
  • 示例:

    1. func ExampleStrSet_IsSubsetOf() {
    2. s1 := gset.NewStrSet(true)
    3. s1.Add([]string{"a", "b", "c", "d"}...)
    4. var s2 gset.StrSet
    5. s2.Add([]string{"a", "b", "d"}...)
    6. fmt.Println(s2.IsSubsetOf(s1))
    7. // Output:
    8. // true
    9. }

Iterator

  • 说明:Iterator 迭代器通过给定的回调函数f随机遍历当前集合set,如果方法f返回true,则继续遍历,否则停止。
  • 格式:

    1. func (set *StrSet) Iterator(f func(v string) bool)
  • 示例:

    1. func ExampleStrSet_Iterator() {
    2. s1 := gset.NewStrSet(true)
    3. s1.Add([]string{"a", "b", "c", "d"}...)
    4. s1.Iterator(func(v string) bool {
    5. fmt.Println("Iterator", v)
    6. return true
    7. })
    8. // May Output:
    9. // Iterator a
    10. // Iterator b
    11. // Iterator c
    12. // Iterator d
    13. }

Join

  • 说明:Join 将集合中的元素项通过字符串glue拼接成新的字符串返回。
  • 格式:

    1. func (set *StrSet) Join(glue string) string
  • 示例:

    1. func ExampleStrSet_Join() {
    2. s1 := gset.NewStrSet(true)
    3. s1.Add([]string{"a", "b", "c", "d"}...)
    4. fmt.Println(s1.Join(","))
    5. // May Output:
    6. // b,c,d,a
    7. }

LockFunc

  • 说明:LockFunc 仅在并发安全场景下有用,该方法通过写锁锁定集合set,并执行回调方法f
  • 格式:

    1. func (set *StrSet) LockFunc(f func(m map[string]struct{}))
  • 示例:

    1. func ExampleStrSet_LockFunc() {
    2. s1 := gset.NewStrSet(true)
    3. s1.Add([]string{"1", "2"}...)
    4. s1.LockFunc(func(m map[string]struct{}) {
    5. m["3"] = struct{}{}
    6. })
    7. fmt.Println(s1.Slice())
    8. // May Output
    9. // [2 3 1]
    10. }

RLockFunc

  • 说明:RLockFunc 仅在并发安全场景下有用,该方法通过读锁锁定集合set,并执行回调方法f
  • 格式:

    1. func (set *StrSet) RLockFunc(f func(m map[string]struct{}))
  • 示例:

    1. func ExampleStrSet_RLockFunc() {
    2. s1 := gset.NewStrSet(true)
    3. s1.Add([]string{"a", "b", "c", "d"}...)
    4. s1.RLockFunc(func(m map[string]struct{}) {
    5. fmt.Println(m)
    6. })
    7. // Output:
    8. // map[a:{} b:{} c:{} d:{}]
    9. }

Merge

  • 说明:Merge将集合others中的所有元素项合并到set中。
  • 格式:

    1. func (set *StrSet) Merge(others ...*StrSet) *StrSet
  • 示例:

    1. func ExampleStrSet_Merge() {
    2. s1 := gset.NewStrSet(true)
    3. s1.Add([]string{"a", "b", "c", "d"}...)
    4. s2 := gset.NewStrSet(true)
    5. // May Output:
    6. // [d a b c]
    7. }

Pop

  • 说明:Pop随机从集合中取出一个元素项。
  • 示例:

    1. func ExampleStrSet_Pop() {
    2. s1 := gset.NewStrSet(true)
    3. fmt.Println(s1.Pop())
    4. // May Output:
    5. // a
    6. }

Pops

  • 说明:Pops 从集合中随机弹出size个元素项。如果size == -1,则返回所有元素项。
  • 格式:

    1. func (set *StrSet) Pops(size int) []string
  • 示例:

    1. func ExampleStrSet_Pops() {
    2. s1 := gset.NewStrSet(true)
    3. s1.Add([]string{"a", "b", "c", "d"}...)
    4. for _, v := range s1.Pops(2) {
    5. fmt.Println(v)
    6. }
    7. // May Output:
    8. // a
    9. // b
    10. }

Remove

  • 说明:Remove从集合中删除指定的元素项item
  • 格式:

    1. func (set *StrSet) Remove(item string)
  • 示例:

    1. func ExampleStrSet_Remove() {
    2. s1 := gset.NewStrSet(true)
    3. s1.Add([]string{"a", "b", "c", "d"}...)
    4. s1.Remove("a")
    5. fmt.Println(s1.Slice())
    6. // May Output:
    7. // [b c d]
    8. }

Size

  • 说明:Size返回集合的大小。
  • 格式:

    1. func (set *StrSet) Size() int
  • 示例:

    1. func ExampleStrSet_Size() {
    2. s1 := gset.NewStrSet(true)
    3. s1.Add([]string{"a", "b", "c", "d"}...)
    4. fmt.Println(s1.Size())
    5. // Output:
    6. // 4
    7. }

Silce

  • 说明:Slice将集合中的元素项以slice的形式返回。
  • 格式:

    1. func (set *StrSet) Slice() []string
  • 示例:

    1. func ExampleStrSet_Slice() {
    2. s1 := gset.NewStrSet(true)
    3. s1.Add([]string{"a", "b", "c", "d"}...)
    4. fmt.Println(s1.Slice())
    5. // May Output:
    6. // [a,b,c,d]
    7. }

String

  • 说明:String将集合按照字符串返回。
  • 格式:

    1. func (set *StrSet) String() string
  • 示例:

    1. func ExampleStrSet_String() {
    2. s1 := gset.NewStrSet(true)
    3. s1.Add([]string{"a", "b", "c", "d"}...)
    4. fmt.Println(s1.String())
    5. // May Output:
    6. // "a","b","c","d"
    7. }

Sum

  • 说明:Sum将集合中的元素项执行求和,注意:只有元素项为数字时才有效,否则您将得到一个意想不到的结果。
  • 格式:

    1. func (set *StrSet) Sum() (sum int)
  • 示例:

    1. func ExampleStrSet_Sum() {
    2. s1 := gset.NewStrSet(true)
    3. s1.Add([]string{"1", "2", "3", "4"}...)
    4. fmt.Println(s1.Sum())
    5. // Output:
    6. // 10
    7. }

Walk

  • 说明:Walk按照用户给定的回调方法f遍历当前集合,并将f的返回结果重新设置当前集合。注意,在并发安全场景中,该方法内部使用写锁来保证并发安全性。
  • 格式:

    1. func (set *StrSet) Walk(f func(item string) string) *StrSet
  • 示例:

    1. func ExampleStrSet_Walk() {
    2. var (
    3. set gset.StrSet
    4. names = g.SliceStr{"user", "user_detail"}
    5. prefix = "gf_"
    6. )
    7. set.Add(names...)
    8. // Add prefix for given table names.
    9. set.Walk(func(item string) string {
    10. return prefix + item
    11. })
    12. fmt.Println(set.Slice())
    13. // May Output:
    14. // [gf_user gf_user_detail]
    15. }

MarshalJSON

  • 说明:MarshalJSON实现了json.MarshalMarshalJSON接口。
  • 格式:

    1. func (set *StrSet) MarshalJSON() ([]byte, error)
  • 示例:

    1. func ExampleStrSet_MarshalJSON() {
    2. type Student struct {
    3. Id int
    4. Name string
    5. Scores *gset.StrSet
    6. }
    7. s := Student{
    8. Id: 1,
    9. Name: "john",
    10. Scores: gset.NewStrSetFrom([]string{"100", "99", "98"}, true),
    11. }
    12. b, _ := json.Marshal(s)
    13. fmt.Println(string(b))
    14. // May Output:
    15. // {"Id":1,"Name":"john","Scores":["100","99","98"]}
    16. }

UnmarshalJSON

  • 说明:UnmarshalJSON实现了json.Unmarshal中的UnmarshalJSON接口。
  • 格式:

    1. func (set *StrSet) UnmarshalJSON(b []byte) error
  • 示例:

    1. func ExampleStrSet_UnmarshalJSON() {
    2. b := []byte(`{"Id":1,"Name":"john","Scores":["100","99","98"]}`)
    3. type Student struct {
    4. Id int
    5. Name string
    6. Scores *gset.StrSet
    7. }
    8. s := Student{}
    9. json.Unmarshal(b, &s)
    10. fmt.Println(s)
    11. // May Output:
    12. // {1 john "99","98","100"}
    13. }

UnmarshalValue

  • 说明: UnfarshalValue实现goframe框架内部统一的设置接口,它通过一个interface{}类型的参数初始化当前对象,至于interface{}参数的使用逻辑由该接口实现方法决定。
  • 格式:

    1. func ExampleStrSet_UnmarshalValue() {
    2. b := []byte(`{"Id":1,"Name":"john","Scores":["100","99","98"]}`)
    3. type Student struct {
    4. Id int
    5. Name string
    6. Scores *gset.StrSet
    7. }
    8. s := Student{}
    9. json.Unmarshal(b, &s)
    10. fmt.Println(s)
    11. // May Output:
    12. // {1 john "99","98","100"}