這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
package setimport ("bytes""fmt")func main() {}type HashSet struct {m map[interface{}]bool}func NewHashSet() *HashSet {return &HashSet{m: make(map[interface{}]bool)}}//添加 true 添加成功 false 添加失敗func (set *HashSet) Add(e interface{}) (b bool) {if !set.m[e] {set.m[e] = truereturn true}return false}//刪除func (set *HashSet) Remove(e interface{}) {delete(set.m, e)}//清除func (set *HashSet) Clear() {set.m = make(map[interface{}]bool)}//是否包含func (set *HashSet) Contains(e interface{}) bool {return set.m[e]}//擷取元素數量func (set *HashSet) Len() int {return len(set.m)}//判斷兩個set時候相同//true 相同 false 不相同func (set *HashSet) Same(other *HashSet) bool {if other == nil {return false}if set.Len() != other.Len() {return false}for k, v := range set.m {if !other.Contains(k) {return false}}return true}//迭代func (set *HashSet) Elements() []interface{} {initlen := len(set.m)snaphot := make([]interface{}, initlen)actuallen := 0for k, v := range set.m {if actuallen < initlen {snaphot[actuallen] = k} else {snaphot = append(snaphot, k)}actuallen++}if actuallen < initlen {snaphot = snaphot[:actuallen]}return snaphot}//擷取自身字串func (set *HashSet) String() string {var buf bytes.Bufferbuf.WriteString("set{")first := truefor k, v := range set.m {if first {first = false} else {buf.WriteString(" ")}buf.WriteString(fmt.Sprintf("%v", k))}buf.WriteString("}")return buf.String()}