4-3. 空结构体

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")
}
Buy me a coffee~
Fred 支付宝支付宝
Fred 微信微信
0%