func (s *Float64Sync) Union(s2 *Float64Sync) *Float64Sync {
	s3 := Float64Sync{}
	s3.nodeMap = make(map[float64]struct{})
	s.RLock()
	for i := range s.nodeMap {
		s3.nodeMap[i] = struct{}{}
	}
	s.RUnlock()
	s2.RLock()
	for i := range s2.nodeMap {
		_, ok := s3.nodeMap[i]
		if !ok {
			s3.nodeMap[i] = struct{}{}
		}
	}
	s2.RUnlock()
	return &s3
}
Union returns all the items that are in S or in S2
package set
import "sync"
type Float64Sync struct {
	nodeMap map[float64]struct{}
	sync.RWMutex
}
func NewFloat64Sync(nums []float64) *Float64Sync {
	s := &Float64Sync{}
	for _, num := range nums {
		s.Add(num)
	}
	return s
}
func (s *Float64Sync) Add(num float64) *Float64Sync {
	s.Lock()
	defer s.Unlock()
	if s.nodeMap == nil {
		s.nodeMap = make(map[float64]struct{})
	}
	_, ok := s.nodeMap[num]
	if !ok {
		s.nodeMap[num] = struct{}{}
	}
	return s
}
func (s *Float64Sync) Clear() {
	s.Lock()
	defer s.Unlock()
	s.nodeMap = make(map[float64]struct{})
}
func (s *Float64Sync) Remove(num float64) bool {
	s.Lock()
	defer s.Unlock()
	_, ok := s.nodeMap[num]
	if ok {
		delete(s.nodeMap, num)
	}
	return ok
}
func (s *Float64Sync) Contains(num float64) bool {
	s.RLock()
	defer s.RUnlock()
	_, ok := s.nodeMap[num]
	return ok
}
func (s *Float64Sync) GetList() []float64 {
	s.RLock()
	defer s.RUnlock()
	nums := []float64{}
	for i := range s.nodeMap {
		nums = append(nums, i)
	}
	return nums
}
func (s *Float64Sync) Size() int {
	s.RLock()
	defer s.RUnlock()
	return len(s.nodeMap)
}