Go每日一题 今日(2023-05-08)
一 、空 struct{} 占多少空间?有什么用途?
在 Go 语言中,空结构体(struct{})不包含任何字段,因此它占用的空间大小为零。在内存中,空结构体实际上不占用任何空间。这使得空结构体在某些特定场景下非常有用。
空结构体的一些用途包括:
用作占位符:在某些情况下,可能需要一个占位符来表示某种状态或值。空结构体可以作为一个轻量级的占位符,不占用内存空间。
用作集合的元素类型:当你需要一个集合(例如,一个包含不重复元素的集合),但不关心元素的值时,可以使用 map[T]struct{},其中 T 是键类型。这种情况下,空结构体用作值,只占用零字节的空间,降低内存开销。例如:
func main() {
set := make(map[string]struct{})
set["A"] = struct{}{}
set["B"] = struct{}{}
set["A"] = struct{}{} // 重复添加 "A",不会导致内存浪费
// 检查某个元素是否在集合中
if _, ok := set["A"]; ok {
fmt.Println("A exists in the set")
}
}
用作信号通道:当使用 Go 语言的通道(channels)进行同步操作时,可以使用空结构体作为通道的类型,表示一个信号,而不是具体的值。这样可以避免不必要的内存分配。例如:
func main() {
done := make(chan struct{})
go func() {
fmt.Println("Working...")
time.Sleep(2 * time.Second)
done <- struct{}{} // 发送一个空结构体信号表示完成
}()
fmt.Println("Waiting for the task to finish...")
<-done // 等待接收空结构体信号
fmt.Println("Task finished.")
}