空结构体

题目:

空 struct{} 占多少空间?有什么用途?

答案:

使用空结构体 struct{} 可以节省内存,一般作为占位符使用,表明这里并不需要一个值。

1
fmt.Println(unsafe.Sizeof(struct{}{})) // 0

比如使用 map 表示集合时,只关注 key,value 可以使用 struct{} 作为占位符。如果使用其他类型作为占位符,例如 int,bool,不仅浪费了内存,而且容易引起歧义。

1
2
3
4
5
6
7
8
9
10
11
12
13
type Set map[string]struct{}

func main() {
set := make(Set)

for _, item := range []string{"A", "A", "B", "C"} {
set[item] = struct{}{}
}
fmt.Println(len(set)) // 3
if _, ok := set["A"]; ok {
fmt.Println("A exists") // A exists
}
}

再比如,使用信道(channel)控制并发时,我们只是需要一个信号,但并不需要传递值,这个时候,也可以使用 struct{} 代替。

1
2
3
4
5
6
7
8
9
func main() {
ch := make(chan struct{}, 1)
go func() {
<-ch
// do something
}()
ch <- struct{}{}
// ...
}

再比如,声明只包含方法的结构体。

1
2
3
4
5
6
7
8
9
type Lamp struct{}

func (l Lamp) On() {
println("On")

}
func (l Lamp) Off() {
println("Off")
}

答案解析来源:空 struct{} 的用途


空结构体
http://example.com/2023/05/08/Go每日一题/空结构体/
作者
Feng Tao
发布于
2023年5月8日
更新于
2023年5月8日
许可协议