func (s StringSet) Equals(t StringSet) bool {
	if len(s) != len(t) {
		return false
	}
	for val := range s {
		if _, ok := t[val]; !ok {
			return false
		}
	}
	return true
}
Equals returns true if all the values of s are in t and vice-versa.
Order is not considered.
package stringset
import (
	"bytes"
	"errors"
	"reflect"
	"sort"
)
var ErrInvalidType = errors.New("invalid type")
type StringSet map[string]struct{}
func New(vals ...string) StringSet {
	s := make(StringSet)
	for _, val := range vals {
		s[val] = struct{}{}
	}
	return s
}
func FromSlice(sl interface{}) (StringSet, error) {
	v := reflect.ValueOf(sl)
	if v.Kind() != reflect.Slice {
		return nil, ErrInvalidType
	}
	if v.Type().Elem().Kind() != reflect.String {
		return nil, ErrInvalidType
	}
	s := make(StringSet, v.Len())
	for i := 0; i < v.Len(); i++ {
		s[v.Index(i).Interface().(string)] = struct{}{}
	}
	return s, nil
}
func FromMapKeys(m interface{}) (StringSet, error) {
	v := reflect.ValueOf(m)
	if v.Kind() != reflect.Map {
		return nil, ErrInvalidType
	}
	if v.Type().Key().Kind() != reflect.String {
		return nil, ErrInvalidType
	}
	s := make(StringSet, v.Len())
	for _, val := range v.MapKeys() {
		s[val.Interface().(string)] = struct{}{}
	}
	return s, nil
}
func FromMapVals(m interface{}) (StringSet, error) {
	v := reflect.ValueOf(m)
	if v.Kind() != reflect.Map {
		return nil, ErrInvalidType
	}
	if v.Type().Elem().Kind() != reflect.String {
		return nil, ErrInvalidType
	}
	s := make(StringSet, v.Len())
	for _, val := range v.MapKeys() {
		s[v.MapIndex(val).Interface().(string)] = struct{}{}
	}
	return s, nil
}
func (s StringSet) Add(val string) {
	s[val] = struct{}{}
}
func (s StringSet) Remove(val string) {
	delete(s, val)
}
func (s StringSet) Has(val string) bool {
	_, ok := s[val]
	return ok
}