Golang实现支持多种类型的set

 更新时间:2023年05月25日 08:50:52   作者:nil  
在项目开发中,常常会用到set去重,为什么不写一个set呢,而且go现在支持了泛型,所以本文就来用Golang实现一个支持多种类型的set呢

写在前面

今天项目中需要用到string类型的set,想起来项目中不少地方都需要,而且都是用map[string]bool实现的,既然这么多地方用到set去重,为什么不写一个set呢?而且go现在支持了泛型,为啥不写一个支持多种类型的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
    }

写完之后发现才60多行代码,非常简单,而且value使用的是struct{}{},不占用任何内存

单测

    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体验了一下泛型,确实挺好用的。本人喜欢造轮子、支持造轮子。只有这样才能提升自己,一起学习吧

到此这篇关于Golang实现支持多种类型的set的文章就介绍到这了,更多相关Golang实现set内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Golang学习之平滑重启

    Golang学习之平滑重启

    这篇文章主要介绍了Golang学习之平滑重启,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-08-08
  • Go语言中的函数详解

    Go语言中的函数详解

    函数是基本的代码块,用于执行一个任务。本文详细讲解了Go语言中的函数,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • go实现脚本解释器gscript

    go实现脚本解释器gscript

    这篇文章主要为大家介绍了go实现脚本解释器gscript示例代码,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • go语言中排序sort的使用方法示例

    go语言中排序sort的使用方法示例

    golang中也实现了排序算法的包sort包,下面这篇文章就来给大家介绍了关于go语言中排序sort的使用方法,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧
    2018-06-06
  • 详解Opentelemetry Collector采集器

    详解Opentelemetry Collector采集器

    这篇文章主要为大家介绍了Opentelemetry Collector神秘的采集器详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • Go语言中数组的基本用法演示

    Go语言中数组的基本用法演示

    这篇文章主要介绍了Go语言中数组的基本用法演示,包括一个冒泡排序算法的简单实现,需要的朋友可以参考下
    2015-10-10
  • Golang实现程序优雅退出的方法详解

    Golang实现程序优雅退出的方法详解

    项目开发过程中,随着需求的迭代,代码的发布会频繁进行,在发布过程中,Golang如何让程序做到优雅的退出?本文就来详细为大家讲讲
    2022-06-06
  • GoFrame gtree树形结构的使用技巧示例

    GoFrame gtree树形结构的使用技巧示例

    这篇文章主要为大家介绍了GoFrame gtree树形结构的使用技巧示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • goLang引入自定义包的方法

    goLang引入自定义包的方法

    今天小编就为大家分享一篇goLang引入自定义包的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-06-06
  • Go语言Elasticsearch数据清理工具思路详解

    Go语言Elasticsearch数据清理工具思路详解

    这篇文章主要介绍了Go语言Elasticsearch数据清理工具思路详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-10-10

最新评论