Golang實現(xiàn)支持多種類型的set
寫在前面
今天項目中需要用到string類型的set,想起來項目中不少地方都需要,而且都是用map[string]bool實現(xiàn)的,既然這么多地方用到set去重,為什么不寫一個set呢?而且go現(xiàn)在支持了泛型,為啥不寫一個支持多種類型的set呢?說干就干
代碼
package set
var (
ElemValue = struct{}{}
)
type SetType interface {
int | int32 | int64 | string | float32 | float64
}
// Set[T SetType]. 集合,線程不安全
type Set[T SetType] interface {
Add(T)
Remove(T)
Contains(T) bool
Empty() bool
Values() []T
}
type set[T SetType] struct {
m map[T]struct{}
}
func NewSet[T SetType](ss ...T) Set[T] {
newSet := set[T]{
m: make(map[T]struct{}, len(ss)),
}
for _, s := range ss {
newSet.Add(s)
}
return &newSet
}
func (s *set[T]) Add(elem T) {
s.m[elem] = ElemValue
}
func (s *set[T]) Remove(elem T) {
delete(s.m, elem)
}
func (s *set[T]) Contains(elem T) bool {
_, ok := s.m[elem]
return ok
}
func (s *set[T]) Empty() bool {
empty := true
for _, _ = range s.m {
empty = false
break
}
return empty
}
func (s *set[T]) Values() []T {
ss := make([]T, 0)
for k, _ := range s.m {
ss = append(ss, k)
}
return ss
}寫完之后發(fā)現(xiàn)才60多行代碼,非常簡單,而且value使用的是struct{}{},不占用任何內(nèi)存
單測
package set_test
import (
"set"
"testing"
"github.com/stretchr/testify/assert"
)
func TestStringSet(t *testing.T) {
newSet := set.NewSet[string]("a", "b")
assert.False(t, newSet.Empty())
newSet.Add("c")
newSet.Remove("a")
assert.False(t, newSet.Contains("a"))
assert.True(t, newSet.Contains("c"))
newSet.Remove("c")
result := newSet.Values()
assert.Equal(t, "b", result[0])
}
func TestInt64Set(t *testing.T) {
newSet := set.NewSet[int64](1, 2)
assert.False(t, newSet.Empty())
newSet.Add(3)
newSet.Remove(1)
assert.False(t, newSet.Contains(1))
assert.True(t, newSet.Contains(3))
newSet.Remove(3)
result := newSet.Values()
assert.Equal(t, int64(2), result[0])
}造輪子感想
之前沒有用過go 泛型,今天寫這個set體驗了一下泛型,確實挺好用的。本人喜歡造輪子、支持造輪子。只有這樣才能提升自己,一起學(xué)習(xí)吧
到此這篇關(guān)于Golang實現(xiàn)支持多種類型的set的文章就介紹到這了,更多相關(guān)Golang實現(xiàn)set內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go微服務(wù)網(wǎng)關(guān)的實現(xiàn)
本文主要介紹了Go微服務(wù)網(wǎng)關(guān)的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07
Go語言學(xué)習(xí)之函數(shù)的定義與使用詳解
這篇文章主要為大家詳細(xì)介紹Go語言中函數(shù)的定義與使用,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)Go語言有一定幫助,需要的可以參考一下2022-04-04
Golang使用channel實現(xiàn)數(shù)據(jù)匯總的方法詳解
這篇文章主要為大家詳細(xì)介紹了在并發(fā)編程中數(shù)據(jù)匯總的問題,并探討了在并發(fā)環(huán)境下使用互斥鎖和通道兩種方式來保證數(shù)據(jù)安全性的方法,需要的可以參考一下2023-05-05
Go語言使用漏桶算法和令牌桶算法來實現(xiàn)API限流
為防止服務(wù)器被過多的請求壓垮,限流是一個至關(guān)重要的技術(shù)手段,下面我們就來看看如何使用漏桶算法和令牌桶算法來實現(xiàn) API 的限流吧2024-11-11

