最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Golang實現(xiàn)支持多種類型的set

 更新時間:2023年05月25日 08:50:52   作者:nil  
在項目開發(fā)中,常常會用到set去重,為什么不寫一個set呢,而且go現(xiàn)在支持了泛型,所以本文就來用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體驗了一下泛型,確實挺好用的。本人喜歡造輪子、支持造輪子。只有這樣才能提升自己,一起學習吧

到此這篇關(guān)于Golang實現(xiàn)支持多種類型的set的文章就介紹到這了,更多相關(guān)Golang實現(xiàn)set內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • golang通過node_exporter監(jiān)控GPU及cpu頻率、溫度的代碼

    golang通過node_exporter監(jiān)控GPU及cpu頻率、溫度的代碼

    node_exporter這個開源組件是配合prometheus收集主機操作系統(tǒng)層的metrics的常用組件,但是官方?jīng)]有提供GPU卡的metrics的采集,今天通過本文給大家介紹golang通過node_exporter監(jiān)控GPU及cpu頻率、溫度的相關(guān)知識,感興趣的朋友一起看看吧
    2022-05-05
  • Golang的Fork/Join實現(xiàn)代碼

    Golang的Fork/Join實現(xiàn)代碼

    Fork/Join本質(zhì)上是一種任務分解,將一個很大的任務分解成若干個小任務,然后再對小任務進一步分解,直到最小顆粒度,然后并發(fā)執(zhí)行,對Golang的Fork/Join實現(xiàn)代碼感興趣的朋友跟隨小編一起看看吧
    2023-01-01
  • GoLang中拼接字符串性能優(yōu)化方法詳解

    GoLang中拼接字符串性能優(yōu)化方法詳解

    最近在做性能優(yōu)化,有個函數(shù)里面的耗時特別長,看里面的操作大多是一些字符串拼接的操作,而字符串拼接在 golang 里面其實有很多種實現(xiàn),下面這篇文章主要給大家介紹了關(guān)于Golang語言如何高效拼接字符串的相關(guān)資料,需要的朋友可以參考下
    2023-02-02
  • golang-redis之sorted set類型操作詳解

    golang-redis之sorted set類型操作詳解

    這篇文章主要介紹了golang-redis之sorted set類型操作詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • 重學Go語言之變量與常量的聲明與使用詳解

    重學Go語言之變量與常量的聲明與使用詳解

    變量、常量的聲明與使用是掌握一門編程語言的基礎,在這篇文章中,小編就來帶大家學習一下Go語言是怎么樣聲明和使用變量與常量吧
    2023-03-03
  • 安裝Sublime?Text支持Go插件的方法步驟

    安裝Sublime?Text支持Go插件的方法步驟

    本文主要介紹了安裝Sublime?Text支持Go插件的方法步驟,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Go語言學習函數(shù)+結(jié)構(gòu)體+方法+接口

    Go語言學習函數(shù)+結(jié)構(gòu)體+方法+接口

    這篇文章主要介紹了Go語言學習函數(shù)+結(jié)構(gòu)體+方法+接口,文章圍繞主題的相關(guān)資料展開詳細的文章說明,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-05-05
  • 一文帶大家搞懂Go語言中的迭代器

    一文帶大家搞懂Go語言中的迭代器

    迭代器是使用戶可在容器對象上遍訪的對象,設計人員使用此接口無需關(guān)心容器對象的內(nèi)存分配的實現(xiàn)細節(jié),本文主要為大家詳細介紹一下Go語言中的迭代器的實現(xiàn),需要的可以了解下
    2025-02-02
  • golang簡單讀寫文件示例

    golang簡單讀寫文件示例

    這篇文章主要介紹了golang簡單讀寫文件的方法,實例分析了Go簡單文件讀取與寫入操作的相關(guān)技巧,需要的朋友可以參考下
    2016-07-07
  • Golang 發(fā)送http請求時設置header的實現(xiàn)

    Golang 發(fā)送http請求時設置header的實現(xiàn)

    這篇文章主要介紹了Golang 發(fā)送http請求時設置header的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-02-02

最新評論

册亨县| 鄂州市| 阳泉市| 万宁市| 岗巴县| 五莲县| 奇台县| 甘泉县| 修水县| 霍城县| 伊川县| 斗六市| 东阿县| 阿勒泰市| 南岸区| 广宁县| 康乐县| 叙永县| 明光市| 云梦县| 荔浦县| 桂阳县| 冷水江市| 同仁县| 阿瓦提县| 北辰区| 兴海县| 石柱| 精河县| 邻水| 汶上县| 九台市| 贵南县| 江阴市| 浪卡子县| 丹阳市| 离岛区| 鹰潭市| 长宁县| 建宁县| 怀集县|