使用空结构体 struct{} 可以节省内存,一般作为占位符使用,表明这里并不需要一个值。
fmt.Println(unsafe.Sizeof(struct{}{})) // 0
比如使用 map 表示集合时,只关注 key,value 可以使用 struct{} 作为占位符。如果使用其他类型作为占位符,例如 int,bool,不仅浪费了内存,而且容易引起歧义。
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{} 代替。
func main() {
ch := make(chan struct{}, 1)
go func() {
<-ch
// do something
}()
ch <- struct{}{}
// ...
}
再比如,声明只包含方法的结构体。
type Lamp struct{}
func (l Lamp) On() {
println("On")
}
func (l Lamp) Off() {
println("Off")
}
答案解析来源:空 struct{} 的用途
struct{} 占用的空间是 0,一般用途和 channel 结合做信号。
可以用来设计Set集合
应该就是空吧
set集合
通过chanel做协程间互动的。
OK
mark
mark
m
点赞
di
这样才对
打卡
mk
mark
占用 0 空间,主要用于 chanle 传递信号
mark
mark
mark
1
struct{}{}空结构体,省内存占位符 1.map只关注Key,如Set集合 2.channel只需要一个信号 3.定义只包含方法的结构体
0,占位符
{{image.png(uploading...)}}空结构的作用
第二次打卡:空 struct{} 的用途
mk
0空间,主要用于chanel传递信号
——来自Go语言圣经
打卡
tag!
mark
1
m
mark
使用空结构体 struct{} 可以节省内存,一般作为占位符使用,表明这里并不需要一个值。
mark
mark
1
mark
mark
打卡
struct{}{}空结构体,省内存占位符 1.map只关注Key,如Set集合 2.channel只需要一个信号 3.定义只包含方法的结构体
mark
mark
打卡
mark
0空间,chan之间传递控制信号,还有map进行去重