diff --git a/g/container/gset/gset.go b/g/container/gset/gset.go index 106f23a8c..6662caf1e 100644 --- a/g/container/gset/gset.go +++ b/g/container/gset/gset.go @@ -18,18 +18,14 @@ type Set struct { m map[interface{}]struct{} } -// Create a set, which contains un-repeated items. -// The param used to specify whether using array with un-concurrent-safety, -// which is false in default, means concurrent-safe in default. -// -// 创建一个空的集合对象,参数unsafe用于指定是否用于非并发安全场景,默认为false,表示并发安全。 +// New create and returns a new set, which contains un-repeated items. +// The param used to specify whether using set in un-concurrent-safety, +// which is false in default. func New(unsafe...bool) *Set { return NewSet(unsafe...) } // See New. -// -// 同New. func NewSet(unsafe...bool) *Set { return &Set{ m : make(map[interface{}]struct{}), @@ -37,10 +33,8 @@ func NewSet(unsafe...bool) *Set { } } -// Iterate the set by given callback , +// Iterator iterates the set with given callback function , // if returns true then continue iterating; or false to stop. -// -// 给定回调函数对原始内容进行遍历,回调函数返回true表示继续遍历,否则停止遍历。 func (set *Set) Iterator(f func (v interface{}) bool) *Set { set.mu.RLock() defer set.mu.RUnlock() @@ -52,9 +46,7 @@ func (set *Set) Iterator(f func (v interface{}) bool) *Set { return set } -// Add one or multiple items to the set. -// -// 添加元素项到集合中(支持多个). +// Add adds one or multiple items to the set. func (set *Set) Add(item...interface{}) *Set { set.mu.Lock() for _, v := range item { @@ -64,9 +56,7 @@ func (set *Set) Add(item...interface{}) *Set { return set } -// Check whether the set contains . -// -// 键是否存在. +// Contains checks whether the set contains . func (set *Set) Contains(item interface{}) bool { set.mu.RLock() _, exists := set.m[item] @@ -74,9 +64,7 @@ func (set *Set) Contains(item interface{}) bool { return exists } -// Remove from set. -// -// 删除元素项。 +// Remove deletes from set. func (set *Set) Remove(item interface{}) *Set { set.mu.Lock() delete(set.m, item) @@ -84,9 +72,7 @@ func (set *Set) Remove(item interface{}) *Set { return set } -// Get size of the set. -// -// 获得集合大小。 +// Size returns the size of the set. func (set *Set) Size() int { set.mu.RLock() l := len(set.m) @@ -94,9 +80,7 @@ func (set *Set) Size() int { return l } -// Clear the set. -// -// 清空集合。 +// Clear deletes all items of the set. func (set *Set) Clear() *Set { set.mu.Lock() set.m = make(map[interface{}]struct{}) @@ -104,9 +88,7 @@ func (set *Set) Clear() *Set { return set } -// Get the copy of items from set as slice. -// -// 获得集合元素项列表. +// Slice returns the a of items of the set as slice. func (set *Set) Slice() []interface{} { set.mu.RLock() i := 0 @@ -119,23 +101,17 @@ func (set *Set) Slice() []interface{} { return ret } -// Join set items with a string. -// -// 使用glue字符串串连当前集合的元素项,构造成新的字符串返回。 +// Join joins items with a string . func (set *Set) Join(glue string) string { return strings.Join(gconv.Strings(set.Slice()), ",") } -// Return set items as a string, which are joined by char ','. -// -// 使用glue字符串串连当前集合的元素项,构造成新的字符串返回。 +// String returns items as a string, which are joined by char ','. func (set *Set) String() string { return set.Join(",") } -// Lock writing by callback function f. -// -// 使用自定义方法执行加锁修改操作。 +// LockFunc locks writing with callback function . func (set *Set) LockFunc(f func(m map[interface{}]struct{})) *Set { set.mu.Lock() defer set.mu.Unlock() @@ -143,9 +119,7 @@ func (set *Set) LockFunc(f func(m map[interface{}]struct{})) *Set { return set } -// Lock reading by callback function f. -// -// 使用自定义方法执行加锁读取操作。 +// RLockFunc locks reading with callback function . func (set *Set) RLockFunc(f func(m map[interface{}]struct{})) *Set { set.mu.RLock() defer set.mu.RUnlock() @@ -153,9 +127,7 @@ func (set *Set) RLockFunc(f func(m map[interface{}]struct{})) *Set { return set } -// Check whether the two sets equal. -// -// 判断两个集合是否相等. +// Equal checks whether the two sets equal. func (set *Set) Equal(other *Set) bool { if set == other { return true @@ -175,9 +147,7 @@ func (set *Set) Equal(other *Set) bool { return true } -// Check whether the current set is sub-set of . -// -// 判断当前集合是否为other集合的子集. +// IsSubsetOf checks whether the current set is a sub-set of . func (set *Set) IsSubsetOf(other *Set) bool { if set == other { return true @@ -194,10 +164,8 @@ func (set *Set) IsSubsetOf(other *Set) bool { return true } -// Returns a new set which is the union of and . -// Which means, all the items in is in or in . -// -// 并集, 返回新的集合:属于set或属于others的元素为元素的集合. +// Union returns a new set which is the union of and . +// Which means, all the items in are in or in . func (set *Set) Union(others ... *Set) (newSet *Set) { newSet = NewSet(true) set.mu.RLock() @@ -222,10 +190,8 @@ func (set *Set) Union(others ... *Set) (newSet *Set) { return } -// Returns a new set which is the difference set from to . -// Which means, all the items in is in and not in . -// -// 差集, 返回新的集合: 属于set且不属于others的元素为元素的集合. +// Diff returns a new set which is the difference set from to . +// Which means, all the items in are in but not in . func (set *Set) Diff(others...*Set) (newSet *Set) { newSet = NewSet(true) set.mu.RLock() @@ -245,10 +211,8 @@ func (set *Set) Diff(others...*Set) (newSet *Set) { return } -// Returns a new set which is the intersection from to . -// Which means, all the items in is in and also in . -// -// 交集, 返回新的集合: 属于set且属于others的元素为元素的集合. +// Intersect returns a new set which is the intersection from to . +// Which means, all the items in are in and also in . func (set *Set) Intersect(others...*Set) (newSet *Set) { newSet = NewSet(true) set.mu.RLock() @@ -269,11 +233,11 @@ func (set *Set) Intersect(others...*Set) (newSet *Set) { return } -// Returns a new set which is the complement from to . -// Which means, all the items in is in and not in . +// Complement returns a new set which is the complement from to . +// Which means, all the items in are in and not in . // -// 补集, 返回新的集合: (前提: set应当为full的子集)属于全集full不属于集合set的元素组成的集合. -// 如果给定的full集合不是set的全集时,返回full与set的差集. +// It returns the difference between and +// if the given set is not the full set of . func (set *Set) Complement(full *Set) (newSet *Set) { newSet = NewSet(true) set.mu.RLock() @@ -288,4 +252,34 @@ func (set *Set) Complement(full *Set) (newSet *Set) { } } return +} + +// Merge adds items from sets into . +func (set *Set) Merge(others ... *Set) *Set { + set.mu.Lock() + defer set.mu.Unlock() + for _, other := range others { + if set != other { + other.mu.RLock() + } + for k, v := range other.m { + set.m[k] = v + } + if set != other { + other.mu.RUnlock() + } + } + return set +} + +// Sum sums items. +// Note: The items should be converted to int type, +// or you'd get a result that you unexpected. +func (set *Set) Sum() (sum int) { + set.mu.RLock() + defer set.mu.RUnlock() + for k, _ := range set.m { + sum += gconv.Int(k) + } + return } \ No newline at end of file diff --git a/g/container/gset/gset_int_set.go b/g/container/gset/gset_int_set.go index a53a90692..4c35a2619 100644 --- a/g/container/gset/gset_int_set.go +++ b/g/container/gset/gset_int_set.go @@ -18,11 +18,9 @@ type IntSet struct { m map[int]struct{} } -// Create a set, which contains un-repeated items. -// The param used to specify whether using array with un-concurrent-safety, -// which is false in default, means concurrent-safe in default. -// -// 创建一个空的集合对象,参数unsafe用于指定是否用于非并发安全场景,默认为false,表示并发安全。 +// New create and returns a new set, which contains un-repeated items. +// The param used to specify whether using set in un-concurrent-safety, +// which is false in default. func NewIntSet(unsafe...bool) *IntSet { return &IntSet{ m : make(map[int]struct{}), @@ -30,10 +28,8 @@ func NewIntSet(unsafe...bool) *IntSet { } } -// Iterate the set by given callback , +// Iterator iterates the set with given callback function , // if returns true then continue iterating; or false to stop. -// -// 给定回调函数对原始内容进行遍历,回调函数返回true表示继续遍历,否则停止遍历。 func (set *IntSet) Iterator(f func (v int) bool) *IntSet { set.mu.RLock() defer set.mu.RUnlock() @@ -45,9 +41,7 @@ func (set *IntSet) Iterator(f func (v int) bool) *IntSet { return set } -// Add one or multiple items to the set. -// -// 添加元素项到集合中(支持多个). +// Add adds one or multiple items to the set. func (set *IntSet) Add(item...int) *IntSet { set.mu.Lock() for _, v := range item { @@ -57,9 +51,7 @@ func (set *IntSet) Add(item...int) *IntSet { return set } -// Check whether the set contains . -// -// 键是否存在. +// Contains checks whether the set contains . func (set *IntSet) Contains(item int) bool { set.mu.RLock() _, exists := set.m[item] @@ -67,9 +59,7 @@ func (set *IntSet) Contains(item int) bool { return exists } -// Remove from set. -// -// 删除元素项。 +// Remove deletes from set. func (set *IntSet) Remove(item int) *IntSet { set.mu.Lock() delete(set.m, item) @@ -77,9 +67,7 @@ func (set *IntSet) Remove(item int) *IntSet { return set } -// Get size of the set. -// -// 获得集合大小。 +// Size returns the size of the set. func (set *IntSet) Size() int { set.mu.RLock() l := len(set.m) @@ -87,9 +75,7 @@ func (set *IntSet) Size() int { return l } -// Clear the set. -// -// 清空集合。 +// Clear deletes all items of the set. func (set *IntSet) Clear() *IntSet { set.mu.Lock() set.m = make(map[int]struct{}) @@ -97,9 +83,7 @@ func (set *IntSet) Clear() *IntSet { return set } -// Get the copy of items from set as slice. -// -// 获得集合元素项列表. +// Slice returns the a of items of the set as slice. func (set *IntSet) Slice() []int { set.mu.RLock() ret := make([]int, len(set.m)) @@ -112,23 +96,17 @@ func (set *IntSet) Slice() []int { return ret } -// Join set items with a string. -// -// 使用glue字符串串连当前集合的元素项,构造成新的字符串返回。 +// Join joins items with a string . func (set *IntSet) Join(glue string) string { return strings.Join(gconv.Strings(set.Slice()), ",") } -// Return set items as a string, which are joined by char ','. -// -// 使用glue字符串串连当前集合的元素项,构造成新的字符串返回。 +// String returns items as a string, which are joined by char ','. func (set *IntSet) String() string { return set.Join(",") } -// Lock writing by callback function f. -// -// 使用自定义方法执行加锁修改操作。 +// LockFunc locks writing with callback function . func (set *IntSet) LockFunc(f func(m map[int]struct{})) *IntSet { set.mu.Lock() defer set.mu.Unlock() @@ -136,9 +114,7 @@ func (set *IntSet) LockFunc(f func(m map[int]struct{})) *IntSet { return set } -// Lock reading by callback function f. -// -// 使用自定义方法执行加锁读取操作。 +// RLockFunc locks reading with callback function . func (set *IntSet) RLockFunc(f func(m map[int]struct{})) *IntSet { set.mu.RLock() defer set.mu.RUnlock() @@ -146,9 +122,7 @@ func (set *IntSet) RLockFunc(f func(m map[int]struct{})) *IntSet { return set } -// Check whether the two sets equal. -// -// 判断两个集合是否相等. +// Equal checks whether the two sets equal. func (set *IntSet) Equal(other *IntSet) bool { if set == other { return true @@ -168,9 +142,7 @@ func (set *IntSet) Equal(other *IntSet) bool { return true } -// Check whether the current set is sub-set of . -// -// 判断当前集合是否为other集合的子集. +// IsSubsetOf checks whether the current set is a sub-set of . func (set *IntSet) IsSubsetOf(other *IntSet) bool { if set == other { return true @@ -187,10 +159,8 @@ func (set *IntSet) IsSubsetOf(other *IntSet) bool { return true } -// Returns a new set which is the union of and . -// Which means, all the items in is in or in . -// -// 并集, 返回新的集合:属于set或属于others的元素为元素的集合. +// Union returns a new set which is the union of and . +// Which means, all the items in are in or in . func (set *IntSet) Union(others ... *IntSet) (newSet *IntSet) { newSet = NewIntSet(true) set.mu.RLock() @@ -215,10 +185,8 @@ func (set *IntSet) Union(others ... *IntSet) (newSet *IntSet) { return } -// Returns a new set which is the difference set from to . -// Which means, all the items in is in and not in . -// -// 差集, 返回新的集合: 属于set且不属于others的元素为元素的集合. +// Diff returns a new set which is the difference set from to . +// Which means, all the items in are in but not in . func (set *IntSet) Diff(others...*IntSet) (newSet *IntSet) { newSet = NewIntSet(true) set.mu.RLock() @@ -238,10 +206,8 @@ func (set *IntSet) Diff(others...*IntSet) (newSet *IntSet) { return } -// Returns a new set which is the intersection from to . -// Which means, all the items in is in and also in . -// -// 交集, 返回新的集合: 属于set且属于others的元素为元素的集合. +// Intersect returns a new set which is the intersection from to . +// Which means, all the items in are in and also in . func (set *IntSet) Intersect(others...*IntSet) (newSet *IntSet) { newSet = NewIntSet(true) set.mu.RLock() @@ -262,11 +228,11 @@ func (set *IntSet) Intersect(others...*IntSet) (newSet *IntSet) { return } -// Returns a new set which is the complement from to . -// Which means, all the items in is in and not in . +// Complement returns a new set which is the complement from to . +// Which means, all the items in are in and not in . // -// 补集, 返回新的集合: (前提: set应当为full的子集)属于全集full不属于集合set的元素组成的集合. -// 如果给定的full集合不是set的全集时,返回full与set的差集. +// It returns the difference between and +// if the given set is not the full set of . func (set *IntSet) Complement(full *IntSet) (newSet *IntSet) { newSet = NewIntSet(true) set.mu.RLock() @@ -282,3 +248,33 @@ func (set *IntSet) Complement(full *IntSet) (newSet *IntSet) { } return } + +// Merge adds items from sets into . +func (set *IntSet) Merge(others ... *IntSet) *IntSet { + set.mu.Lock() + defer set.mu.Unlock() + for _, other := range others { + if set != other { + other.mu.RLock() + } + for k, v := range other.m { + set.m[k] = v + } + if set != other { + other.mu.RUnlock() + } + } + return set +} + +// Sum sums items. +// Note: The items should be converted to int type, +// or you'd get a result that you unexpected. +func (set *IntSet) Sum() (sum int) { + set.mu.RLock() + defer set.mu.RUnlock() + for k, _ := range set.m { + sum += k + } + return +} \ No newline at end of file diff --git a/g/container/gset/gset_string_set.go b/g/container/gset/gset_string_set.go index 39faeb2fb..3b77d3b30 100644 --- a/g/container/gset/gset_string_set.go +++ b/g/container/gset/gset_string_set.go @@ -9,7 +9,8 @@ package gset import ( "github.com/gogf/gf/g/internal/rwmutex" - "strings" + "github.com/gogf/gf/g/util/gconv" + "strings" ) type StringSet struct { @@ -17,11 +18,9 @@ type StringSet struct { m map[string]struct{} } -// Create a set, which contains un-repeated items. -// The param used to specify whether using array with un-concurrent-safety, -// which is false in default, means concurrent-safe in default. -// -// 创建一个空的集合对象,参数unsafe用于指定是否用于非并发安全场景,默认为false,表示并发安全。 +// New create and returns a new set, which contains un-repeated items. +// The param used to specify whether using set in un-concurrent-safety, +// which is false in default. func NewStringSet(unsafe...bool) *StringSet { return &StringSet { m : make(map[string]struct{}), @@ -29,10 +28,8 @@ func NewStringSet(unsafe...bool) *StringSet { } } -// Iterate the set by given callback , +// Iterator iterates the set with given callback function , // if returns true then continue iterating; or false to stop. -// -// 给定回调函数对原始内容进行遍历,回调函数返回true表示继续遍历,否则停止遍历。 func (set *StringSet) Iterator(f func (v string) bool) *StringSet { set.mu.RLock() defer set.mu.RUnlock() @@ -44,9 +41,7 @@ func (set *StringSet) Iterator(f func (v string) bool) *StringSet { return set } -// Add one or multiple items to the set. -// -// 添加元素项到集合中(支持多个). +// Add adds one or multiple items to the set. func (set *StringSet) Add(item...string) *StringSet { set.mu.Lock() for _, v := range item { @@ -56,9 +51,7 @@ func (set *StringSet) Add(item...string) *StringSet { return set } -// Check whether the set contains . -// -// 键是否存在. +// Contains checks whether the set contains . func (set *StringSet) Contains(item string) bool { set.mu.RLock() _, exists := set.m[item] @@ -66,9 +59,7 @@ func (set *StringSet) Contains(item string) bool { return exists } -// Remove from set. -// -// 删除元素项。 +// Remove deletes from set. func (set *StringSet) Remove(item string) *StringSet { set.mu.Lock() delete(set.m, item) @@ -76,9 +67,7 @@ func (set *StringSet) Remove(item string) *StringSet { return set } -// Get size of the set. -// -// 获得集合大小。 +// Size returns the size of the set. func (set *StringSet) Size() int { set.mu.RLock() l := len(set.m) @@ -86,9 +75,7 @@ func (set *StringSet) Size() int { return l } -// Clear the set. -// -// 清空集合。 +// Clear deletes all items of the set. func (set *StringSet) Clear() *StringSet { set.mu.Lock() set.m = make(map[string]struct{}) @@ -96,9 +83,7 @@ func (set *StringSet) Clear() *StringSet { return set } -// Get the copy of items from set as slice. -// -// 获得集合元素项列表. +// Slice returns the a of items of the set as slice. func (set *StringSet) Slice() []string { set.mu.RLock() ret := make([]string, len(set.m)) @@ -112,23 +97,17 @@ func (set *StringSet) Slice() []string { return ret } -// Join set items with a string. -// -// 使用glue字符串串连当前集合的元素项,构造成新的字符串返回。 +// Join joins items with a string . func (set *StringSet) Join(glue string) string { return strings.Join(set.Slice(), ",") } -// Return set items as a string, which are joined by char ','. -// -// 使用glue字符串串连当前集合的元素项,构造成新的字符串返回。 +// String returns items as a string, which are joined by char ','. func (set *StringSet) String() string { return set.Join(",") } -// Lock writing by callback function f. -// -// 使用自定义方法执行加锁修改操作。 +// LockFunc locks writing with callback function . func (set *StringSet) LockFunc(f func(m map[string]struct{})) *StringSet { set.mu.Lock() defer set.mu.Unlock() @@ -136,9 +115,7 @@ func (set *StringSet) LockFunc(f func(m map[string]struct{})) *StringSet { return set } -// Lock reading by callback function f. -// -// 使用自定义方法执行加锁读取操作。 +// RLockFunc locks reading with callback function . func (set *StringSet) RLockFunc(f func(m map[string]struct{})) *StringSet { set.mu.RLock() defer set.mu.RUnlock() @@ -146,9 +123,7 @@ func (set *StringSet) RLockFunc(f func(m map[string]struct{})) *StringSet { return set } -// Check whether the two sets equal. -// -// 判断两个集合是否相等. +// Equal checks whether the two sets equal. func (set *StringSet) Equal(other *StringSet) bool { if set == other { return true @@ -168,9 +143,7 @@ func (set *StringSet) Equal(other *StringSet) bool { return true } -// Check whether the current set is sub-set of . -// -// 判断当前集合是否为other集合的子集. +// IsSubsetOf checks whether the current set is a sub-set of . func (set *StringSet) IsSubsetOf(other *StringSet) bool { if set == other { return true @@ -187,10 +160,8 @@ func (set *StringSet) IsSubsetOf(other *StringSet) bool { return true } -// Returns a new set which is the union of and . -// Which means, all the items in is in or in . -// -// 并集, 返回新的集合:属于set或属于others的元素为元素的集合. +// Union returns a new set which is the union of and . +// Which means, all the items in are in or in . func (set *StringSet) Union(others ... *StringSet) (newSet *StringSet) { newSet = NewStringSet(true) set.mu.RLock() @@ -215,10 +186,8 @@ func (set *StringSet) Union(others ... *StringSet) (newSet *StringSet) { return } -// Returns a new set which is the difference set from to . -// Which means, all the items in is in and not in . -// -// 差集, 返回新的集合: 属于set且不属于others的元素为元素的集合. +// Diff returns a new set which is the difference set from to . +// Which means, all the items in are in but not in . func (set *StringSet) Diff(others...*StringSet) (newSet *StringSet) { newSet = NewStringSet(true) set.mu.RLock() @@ -238,10 +207,8 @@ func (set *StringSet) Diff(others...*StringSet) (newSet *StringSet) { return } -// Returns a new set which is the intersection from to . -// Which means, all the items in is in and also in . -// -// 交集, 返回新的集合: 属于set且属于others的元素为元素的集合. +// Intersect returns a new set which is the intersection from to . +// Which means, all the items in are in and also in . func (set *StringSet) Intersect(others...*StringSet) (newSet *StringSet) { newSet = NewStringSet(true) set.mu.RLock() @@ -262,11 +229,11 @@ func (set *StringSet) Intersect(others...*StringSet) (newSet *StringSet) { return } -// Returns a new set which is the complement from to . -// Which means, all the items in is in and not in . +// Complement returns a new set which is the complement from to . +// Which means, all the items in are in and not in . // -// 补集, 返回新的集合: (前提: set应当为full的子集)属于全集full不属于集合set的元素组成的集合. -// 如果给定的full集合不是set的全集时,返回full与set的差集. +// It returns the difference between and +// if the given set is not the full set of . func (set *StringSet) Complement(full *StringSet) (newSet *StringSet) { newSet = NewStringSet(true) set.mu.RLock() @@ -282,3 +249,33 @@ func (set *StringSet) Complement(full *StringSet) (newSet *StringSet) { } return } + +// Merge adds items from sets into . +func (set *StringSet) Merge(others ... *StringSet) *StringSet { + set.mu.Lock() + defer set.mu.Unlock() + for _, other := range others { + if set != other { + other.mu.RLock() + } + for k, v := range other.m { + set.m[k] = v + } + if set != other { + other.mu.RUnlock() + } + } + return set +} + +// Sum sums items. +// Note: The items should be converted to int type, +// or you'd get a result that you unexpected. +func (set *StringSet) Sum() (sum int) { + set.mu.RLock() + defer set.mu.RUnlock() + for k, _ := range set.m { + sum += gconv.Int(k) + } + return +} \ No newline at end of file diff --git a/geg/net/ghttp/server/router/group/group1.go b/geg/net/ghttp/server/router/group/group1.go index 70c77891f..36af78de2 100644 --- a/geg/net/ghttp/server/router/group/group1.go +++ b/geg/net/ghttp/server/router/group/group1.go @@ -61,15 +61,16 @@ func main() { //g.REST("/obj/rest", obj) // 分组路由批量注册 - s.Group("/api").Bind([]ghttp.GroupItem { - {"ALL", "/handler", Handler}, - {"ALL", "/ctl", ctl}, - {"GET", "/ctl/my-show", ctl, "Show"}, - {"REST", "/ctl/rest", ctl}, - {"ALL", "/obj", obj}, - {"GET", "/obj/my-show", obj, "Show"}, - {"REST", "/obj/rest", obj}, - {"ALL", "*", HookHandler, ghttp.HOOK_BEFORE_SERVE}, + s.Group("/api").Bind([]ghttp.GroupItem{ + + {"ALL", "/handler", Handler}, + {"ALL", "/ctl", ctl}, + {"GET", "/ctl/my-show", ctl, "Show"}, + {"REST", "/ctl/rest", ctl}, + {"ALL", "/obj", obj}, + {"GET", "/obj/my-show", obj, "Show"}, + {"REST", "/obj/rest", obj}, + {"ALL", "*", HookHandler, ghttp.HOOK_BEFORE_SERVE}, }) s.SetPort(8199) diff --git a/geg/other/test.go b/geg/other/test.go index 393068584..40d3908e9 100644 --- a/geg/other/test.go +++ b/geg/other/test.go @@ -1,9 +1,52 @@ package main import ( + "github.com/gogf/gf/g/container/gset" "fmt" - "github.com/gogf/gf/g/util/gconv" ) + func main() { - fmt.Println(gconv.Map(1)) + // 创建一个非并发安全的集合对象 + s := gset.New(true) + + // 添加数据项 + s.Add(1) + + // 批量添加数据项 + s.Add([]interface{}{1, 2, 3}...) + + // 集合数据项大小 + fmt.Println(s.Size()) + + // 集合中是否存在指定数据项 + fmt.Println(s.Contains(2)) + + // 返回数据项slice + fmt.Println(s.Slice()) + + // 删除数据项 + s.Remove(3) + + // 遍历数据项 + s.Iterator(func(v interface{}) bool { + fmt.Println("Iterator:", v) + return true + }) + + // 将集合转换为字符串 + fmt.Println(s.String()) + + // 并发安全写锁操作 + s.LockFunc(func(m map[interface{}]struct{}) { + m[4] = struct{}{} + }) + + // 并发安全读锁操作 + s.RLockFunc(func(m map[interface{}]struct{}) { + fmt.Println(m) + }) + + // 清空集合 + s.Clear() + fmt.Println(s.Size()) } \ No newline at end of file