在写代码的过程中,避免不了用到 set 数据结构。但是在 Go 语言中并没有直接提供一个内置的的 set 类型供我们直接使用,这个时候就需要我们自己通过 Go 语言提供的内置类型 map 来实现一个。

如果 把 map 当做 set 来使用,那么 map 的 key 就可以作为 set 的内容,map 的 value 自然就是冗余的,但是又不能舍弃,那么这个 value 存什么类型的值比较合适呢?换句话说什么类型的值占用内存是最少的呢? byte ? bool ? int ? float32? interface{} ? struct{} ?

我们不妨通过以下代码来查看一下各个类型所占用的实际内存:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
func main() {
	var b bool
	fmt.Println("bool:", unsafe.Sizeof(b))

	var in int
	fmt.Println("int:", unsafe.Sizeof(in))

	var f float32
	fmt.Println("float32:", unsafe.Sizeof(f))

	var s struct{}
	fmt.Println("struct{}:", unsafe.Sizeof(s))

	var i interface{}
	fmt.Println("interface{}:", unsafe.Sizeof(i))

}

输出:

1
2
3
4
5
bool: 1
int: 4
float32: 4
struct{}: 0
interface{}: 8

从以上输出我们可以看到,struct{} 也就是空结构体类型是不占用内存的,因此我们用 struct{} 来作为 map 的 value 是最合适的。

1
map[ key ] struct{}