GoFrame框架gset使用對比PHP?Java?Redis優(yōu)勢

這篇文章將會(huì)為大家介紹GoFrame gset使用入門,為了讓大家更好的理解,會(huì)簡明扼要的分析一下集合類型Set的特點(diǎn),對比一下Java、PHP、原生Go對集合Set類型的支持情況,如果不支持Set類型,我們?nèi)绾握业浇鉀Q方案,來實(shí)現(xiàn)元素不可重復(fù)性和交差并補(bǔ)集的需求。
特點(diǎn)
集合gset:一組不可重復(fù)的元素,元素可以是任何類型
上一篇文章介紹的: GoFrame的garray為什么比PHP的array還好用? garray的排序數(shù)組也可以通過設(shè)置SetUnique(true),設(shè)置元素不可重復(fù)的特性。
使用入門
- 支持設(shè)置并發(fā)安全的開關(guān)
- 批量添加元素時(shí),注意傳參:切片后要加上... 即把切片打散之后添加
- Size() 獲得集合大小
- Contains() 判斷是否包含指定值
- Remove() 移除元素
- 支持使用Iterator遍歷
- 可以通過 集合.String() ,一鍵將集合轉(zhuǎn)成字符串
- 通過 集合.LockFunc() 實(shí)現(xiàn)并發(fā)安全寫操作
- 通過 集合.RLockFunc() 實(shí)現(xiàn)并發(fā)安全讀操作
- Clear() 清空集合
package main
import (
"fmt"
"github.com/gogf/gf/container/gset"
)
func main() {
//創(chuàng)建一個(gè)并發(fā)安全的集合對象
s := gset.New(true)
//添加數(shù)據(jù)
s.Add(1)
// 批量添加數(shù)據(jù)
s.Add([]interface{}{2, 3, 4, 5}...) //注意 這里要用... 即把切片打散之后添加
// 打印結(jié)果
fmt.Println(s)
fmt.Println("集合的大?。?, s.Size())
fmt.Println("集合的大?。?, s.Size())
fmt.Println("集合中是否包含某個(gè)值:", s.Contains(5))
fmt.Println("集合中是否包含某個(gè)值:", s.Contains(10))
fmt.Println("返回?cái)?shù)據(jù)項(xiàng):", s.Slice())
s.Remove(1) //刪除的是數(shù)據(jù)項(xiàng) 不是根據(jù)索引刪除
fmt.Println("remove刪除數(shù)據(jù)項(xiàng)之后:", s)
// 遍歷
s.Iterator(func(v interface{}) bool {
fmt.Println("遍歷結(jié)果:", v)
return true
})
// 集合轉(zhuǎn)字符串
fmt.Println("集合轉(zhuǎn)字符串:", s.String())
// 并發(fā)安全寫鎖操作
s.LockFunc(func(m map[interface{}]struct{}) {
m[6] = struct{}{}
})
// 并發(fā)安全讀鎖操作
s.RLockFunc(func(m map[interface{}]struct{}) {
fmt.Println("并發(fā)安全讀鎖操作:", m)
})
// 清空集合
s.Clear()
fmt.Println("清空集合后:", s)
}
打印結(jié)果

對比PHP和Java
PHP
PHP是沒有Set數(shù)據(jù)類型的,set關(guān)鍵字作為一個(gè)賦值函數(shù)使用。在PHP中,__set()方法可以用于為私有成員屬性設(shè)置值,給一個(gè)未定義的屬性賦值時(shí)會(huì)被觸發(fā);
使用Set一個(gè)非常重要的場景就是使用交差并補(bǔ)集;之前用PHP開發(fā)項(xiàng)目時(shí),我們是使用Redis的Set來實(shí)現(xiàn)交差并補(bǔ)集需求的。

JAVA
在Java中,是有Set類型的:存取無序,元素唯一。
GO原生
Go原生也是不提供Set類型的,但是GoFrame為我們提供了gset類型。
GoFrame
我們可以基于gset實(shí)現(xiàn)不可重復(fù)元素的需求,當(dāng)然,如果是Java轉(zhuǎn)Go的同學(xué),使用gset應(yīng)該會(huì)更加得心應(yīng)手。
延伸
下圖是Go原生提供的數(shù)據(jù)類型,讓我們確信go原生并未支持set類型,但是支持Map類型。
而Map的key不能有重復(fù)值,當(dāng)我們使用Go原生開發(fā)時(shí),如果要實(shí)現(xiàn)不可重復(fù)元素的需求可以使用Map的這一特性。
Go原生開發(fā)要實(shí)現(xiàn)交差并補(bǔ)集,一樣可以像我們一樣,使用Redis的集合set,Redis還支持有序集合(sorted set)。

以上就是GoFrame框架gset使用對比PHP Java Redis優(yōu)勢的詳細(xì)內(nèi)容,更多關(guān)于GoFrame框架gset優(yōu)勢的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Go語言實(shí)現(xiàn)讀取文件的方式總結(jié)
這篇文章主要為大家詳細(xì)介紹了Go語言實(shí)現(xiàn)讀取文件的幾個(gè)方式,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)Go語言有一定的幫助,感興趣的小伙伴可以收藏一下2023-04-04
解決Go中攔截HTTP流數(shù)據(jù)時(shí)字段丟失的問題
在開發(fā)高并發(fā)的Web應(yīng)用時(shí),尤其是在處理HTTP代理和流數(shù)據(jù)攔截的場景下,遇到數(shù)據(jù)丟失的問題并不罕見,最近,在一個(gè)項(xiàng)目中,我遇到了一個(gè)棘手的問題:在攔截并轉(zhuǎn)發(fā)HTTP流數(shù)據(jù)的過程中,某些數(shù)據(jù)字段因?yàn)樘幚磉^快而被丟失,所以本文給大家介紹如何解決這個(gè)問題2024-08-08
Go語言使用sync.Mutex實(shí)現(xiàn)資源加鎖
數(shù)據(jù)共享是一把雙刃劍,Go語言為我們提供了?sync.Mutex,一種最基礎(chǔ)也是最常用的加鎖方式,用于保證在任意時(shí)刻只有一個(gè) goroutine 能訪問共享資源,下面我們就來看看具體實(shí)現(xiàn)吧2025-08-08

