GoFrame框架gset使用對比PHP Java Redis優勢
這篇文章將會為大傢介紹GoFrame gset使用入門,為瞭讓大傢更好的理解,會簡明扼要的分析一下集合類型Set的特點,對比一下Java、PHP、原生Go對集合Set類型的支持情況,如果不支持Set類型,我們如何找到解決方案,來實現元素不可重復性和交差並補集的需求。
特點
集合gset:一組不可重復的元素,元素可以是任何類型
上一篇文章介紹的: GoFrame的garray為什麼比PHP的array還好用? garray的排序數組也可以通過設置SetUnique(true),設置元素不可重復的特性。
使用入門
- 支持設置並發安全的開關
- 批量添加元素時,註意傳參:切片後要加上… 即把切片打散之後添加
- Size() 獲得集合大小
- Contains() 判斷是否包含指定值
- Remove() 移除元素
- 支持使用Iterator遍歷
- 可以通過 集合.String() ,一鍵將集合轉成字符串
- 通過 集合.LockFunc() 實現並發安全寫操作
- 通過 集合.RLockFunc() 實現並發安全讀操作
- Clear() 清空集合
package main import ( "fmt" "github.com/gogf/gf/container/gset" ) func main() { //創建一個並發安全的集合對象 s := gset.New(true) //添加數據 s.Add(1) // 批量添加數據 s.Add([]interface{}{2, 3, 4, 5}...) //註意 這裡要用... 即把切片打散之後添加 // 打印結果 fmt.Println(s) fmt.Println("集合的大小:", s.Size()) fmt.Println("集合的大小:", s.Size()) fmt.Println("集合中是否包含某個值:", s.Contains(5)) fmt.Println("集合中是否包含某個值:", s.Contains(10)) fmt.Println("返回數據項:", s.Slice()) s.Remove(1) //刪除的是數據項 不是根據索引刪除 fmt.Println("remove刪除數據項之後:", s) // 遍歷 s.Iterator(func(v interface{}) bool { fmt.Println("遍歷結果:", v) return true }) // 集合轉字符串 fmt.Println("集合轉字符串:", s.String()) // 並發安全寫鎖操作 s.LockFunc(func(m map[interface{}]struct{}) { m[6] = struct{}{} }) // 並發安全讀鎖操作 s.RLockFunc(func(m map[interface{}]struct{}) { fmt.Println("並發安全讀鎖操作:", m) }) // 清空集合 s.Clear() fmt.Println("清空集合後:", s) }
打印結果
對比PHP和Java
PHP
PHP是沒有Set數據類型的,set關鍵字作為一個賦值函數使用。在PHP中,__set()方法可以用於為私有成員屬性設置值,給一個未定義的屬性賦值時會被觸發;
使用Set一個非常重要的場景就是使用交差並補集;之前用PHP開發項目時,我們是使用Redis的Set來實現交差並補集需求的。
JAVA
在Java中,是有Set類型的:存取無序,元素唯一。
GO原生
Go原生也是不提供Set類型的,但是GoFrame為我們提供瞭gset類型。
GoFrame
我們可以基於gset實現不可重復元素的需求,當然,如果是Java轉Go的同學,使用gset應該會更加得心應手。
延伸
下圖是Go原生提供的數據類型,讓我們確信go原生並未支持set類型,但是支持Map類型。
而Map的key不能有重復值,當我們使用Go原生開發時,如果要實現不可重復元素的需求可以使用Map的這一特性。
Go原生開發要實現交差並補集,一樣可以像我們一樣,使用Redis的集合set,Redis還支持有序集合(sorted set)。
以上就是GoFrame框架gset使用對比PHP Java Redis優勢的詳細內容,更多關於GoFrame框架gset優勢的資料請關註WalkonNet其它相關文章!
推薦閱讀:
- GoFrame框架garray對比PHP的array優勢
- GoFrame glist 基礎使用和自定義遍歷
- GoFrame框架gset交差並補集使用實例
- GoFrame gtree樹形結構的使用技巧示例
- Go 通過結構struct實現接口interface的問題