go set如何表示

一、Go 的数据结构

Go 内置的数据结构并不多。最常用的两种数据结构分别是 slice 和 map,即切片和映射。( 切片的底层就是数组,因为有了切片比较少用)

除了 Go 内置的数据结构,还有一些数据结构是由 Go 的官方 container 包提供,如 heap 堆、list 双向链表和ring 回环链表。(了解原理,看看文档也就会用了)

 

二、set

set 和 bitset ,Go 当前还没有以任何形式提供。(编程语言中没有go的选项

package set

import (
    "fmt"
    "sort"
)

//空缓存
type Empty struct{}

var empty Empty

//构造一个set,首先定义set的类型
type Set struct {
    m map[int]Empty
}

//产生set的工厂
func SetFactory() *Set {
    return &Set{
        m: map[int]Empty{},
    }
}

//添加元素
func (s *Set) Add(val int) { //表示给 Set声明一个方法
    s.m[val] = empty
}

//删除元素
func (s *Set) Remove(val int) {
    delete(s.m, val)
}

//获取长度
func (s *Set) Len() int {
    return len(s.m)
}

//清空set
func (s *Set) Clear() {
    s.m = make(map[int]Empty)
}

//遍历set
func (s *Set) Traverse() map[int]Empty {
    return s.m
    //for v := range s.m {
    //    fmt.Println(v)
    //}
}

//set 转 list
func (s *Set) SetToList() []int {
    var a []int
    for v := range s.m {
        a = append(a, v)
    }
    return a
}

//排序输出
func (s *Set) SortTraverse() {
    vals := make([]int, 0, s.Len())

    for v := range s.m {
        vals = append(vals, v)
    }

    //排序
    sort.Ints(vals)

    for _, v := range vals {
        fmt.Println(v)
    }
}

//判读key存在
func (s *Set) KeyExist(key int) bool {
    if _, ok := s.m[key]; ok {
        return true
    } else {
        return false
    }
}

//set 并集
func (s *Set) Union(b *Set) {
    for key, _ := range b.m {
        s.m[key] = empty
    }
}

三、bitset

bitset 的话,https://godoc.org/github.com/willf/bitset#example-BitSet-Len  (go文档)   https://github.com/yourbasic/bit/blob/master/set.go  这个也可以参考

bitset 中每个数子用一个 bit 即能表示,对于一个 int8 的数字,我们可以用它表示 8 个数字,能帮助我们大大节省数据的存储空间。

bitset 最常见的应用有 bitmap 和 flag,即位图和标志位。

bitset 工作中很少用到  https://juejin.im/post/5ceffeddf265da1bc8540df5 

 

 

posted @ 2020-07-09 08:36  薄荷味日记  阅读(360)  评论(0编辑  收藏  举报