约 500 字 预计阅读 1 分钟
1 空结构体
-
空结构体不包含任何字段struct{}{}
-
空结构体不占内存空间
1
2
3
4
5
6
7
8
9
10
|
package main
import (
"fmt"
"unsafe"
)
func main() {
fmt.Println(unsafe.Sizeof(struct{}{})) // 0
}
|
2 空结构的作用
2.1 1. 与map结合实现set
- Go 语言标准库没有提供 Set 的实现,通常使用 map 来代替。事实上,对于集合来说,只需要 map 的键,而不需要值。即使是将值设置为 bool 类型,也会多占据 1 个字节,那假设 map 中有一百万条数据,就会浪费 1MB 的空间
- 将 map 作为集合(Set)使用时,可以将值类型定义为空结构体,仅作为占位符使用即可。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
type Set map[string]struct{}
func (s Set) Has(key string) bool {
_, ok := s[key]
return ok
}
func (s Set) Add(key string) {
s[key] = struct{}{}
}
func (s Set) Delete(key string) {
delete(s, key)
}
func main() {
s := make(Set)
s.Add("Tom")
s.Add("Sam")
fmt.Println(s.Has("Tom"))
fmt.Println(s.Has("Jack"))
}
|
2.2 2. 制造伪迭代器
1
2
3
|
for range make([]struct{}, 100) {
fmt.Println("迭代器")
}
|
2.3 3. 不发送数据的channel
1
2
3
4
5
6
7
8
9
10
11
|
func worker(ch chan struct{}) {
<-ch
fmt.Println("do something")
close(ch)
}
func main() {
ch := make(chan struct{})
go worker(ch)
ch <- struct{}{}
}
|
2.4 4. 仅包含方法的结构体
1
2
3
4
5
6
7
8
9
|
type Door struct{}
func (d Door) Open() {
fmt.Println("Open the door")
}
func (d Door) Close() {
fmt.Println("Close the door")
}
|