Flag Counter
© 2017 Tao Peng. All rights reserved.

Go语言 实现简单的 Set


2016年05月31日

本文实现了简单的GO语言Set结构, 是基于Map实现的, 基本的代码如下:

//TODO: 实现一个简单的Set
//
// 需要一个map保存数据, 同时需要一个读写锁(保证线程安全)
// 可以保存所有的类型作为Key
type Set struct {
	m map[interface{}]bool
	sync.RWMutex
}


// New: 返回一个Set实例
func New() *Set {
	return &Set{
		m: map[interface{}]bool{},
	}
}

// Add: 增加一个元素
func (s *Set)Add(item interface{})  {
	s.Lock()
	defer s.Unlock()
	s.m[item] = true
}

// Remove: 移除一个元素
func (s *Set)Remove(item interface{})  {
	s.Lock()
	defer s.Unlock()
	delete(s.m, item)
}

// Has: 是否存在指定的元素
func (s *Set)Has(item interface{}) bool {
	// 允许读
	s.RLock()
	defer s.RUnlock()
	_, ok := s.m[item]
	return ok
}

// List: 获取Map转化成的list
func (s *Set)List() []interface{} {
	s.RLock()
	defer s.RUnlock()
	var l []interface{}
	for value := range s.m {
		l = append(l, value)
	}
	return l
}

// Len: 返回元素个数
func (s *Set)Len() int {
	return len(s.List())
}

// Clear: 清除Set
func (s *Set) Clear() {
	s.Lock()
	defer s.Unlock()
	s.m = map[interface{}]bool{}
}

// Empty: Set是否是空
func (s *Set) IsEmpty() bool {
	if s.Len() == 0 {
		return true
	}
	return false
}


// Main测试
func main() {
	s := New()
	s.Add(1)
	s.Add("2")
	s.Add("3")
	s.Add(3.333)
	fmt.Println(s.List())

	s.Remove("2")
	fmt.Println(s.List())

	if s.Has("2") {
		fmt.Println("2 exist")
	} else {
		fmt.Println("2 not exist")
	}
	if s.Has("3") {
		fmt.Println("3 exist")
	} else {
		fmt.Println("3 not exist")
	}

	fmt.Println("len = ", s.Len())

	fmt.Println("Is empty: ", s.IsEmpty())
	s.Clear()
	fmt.Println("Is empty: ", s.IsEmpty())
}