共计 1241 个字符,预计需要花费 4 分钟才能阅读完成。
空构造体指的是不蕴含任何字段或元素的构造体,size 为 0
为什么要用空构造体:
空构造体 struct{} 为什么会存在的外围理由就是为了节俭内存。当你须要一个构造体,然而却丝毫不关系外面的内容,那么就能够思考空构造体。golang 外围的几个复合构造 map,chan,slice 都能联合 struct{} 应用。
做管制而非数据信息:chan struct{}
实现 set: map[string]struct{}
应用的场景次要分为三块:
1. 实现办法接收者
2. 实现汇合类型
3. 实现空通道
1、实现办法接收者
在业务场景下,咱们须要将办法组合起来,代表其是一个”分组“的,便于后续拓展和保护。
然而如果咱们应用:
type T struct{}
type T string
func (s *T) Call()
又仿佛有点不大敌对,因为作为一个字符串类型,其自身会占据定的空间。
这种时候咱们会采纳空构造体的形式,这样也便于将来针对该类型进行公共字段等的减少。
如下:
type T struct{}
func (s *T) Call() {fmt.Println("脑子进煎鱼了")
}
func main() {
var s T
s.Call()}
在该场景下,应用空构造体从多维度来考量是最合适的,易拓展,省空间,最结构化。
另外你会发现,其实你在日常开发中下意识就曾经这么做了,你能够了解为设计模式和日常生活相结合的另类案例。
2、实现汇合类型
在 Go 语言的规范库中并没有提供汇合(Set)的相干实现,因而个别在代码中咱们图不便,会间接用 map 来代替。
但有个问题,就是汇合类型的应用,只须要用到 key(键),不须要 value(值)。
type Set map[string]struct{}
type Set map[string]struct{}
func (s Set) Append(k string) {s[k] = struct{}{}
}
func (s Set) Remove(k string) {delete(s, k)
}
func (s Set) Exist(k string) bool {_, ok := s[k]
return ok
}
func main() {set := Set{}
set.Append("大鱼")
set.Append("小鱼")
set.Append("咸鱼")
set.Remove("咸鱼")
fmt.Println(set.Exist("死鱼"))
}
3、实现空通道
在 Go channel 的应用场景中,经常会遇到告诉型 channel,其不须要发送任何数据,只是用于协调 Goroutine 的运行,用于流转各类状态或是管制并发状况。
如下:
ch := make(chan struct{})
func main() {ch := make(chan struct{})
go func() {time.Sleep(1 * time.Second)
close(ch)
}()
fmt.Println("今天天气...")
<-ch
fmt.Println("很不错!")
}
参考文章:https://zhuanlan.zhihu.com/p/…