介绍
struct是Go中的关键字,用于定义结构类型。
struct {}是一个无元素的结构体类型(空结构体),通常在没有信息存储时使用。优点是大小为0,不需要内存来存储struct {}类型的值。
func main() {
var s struct{}
fmt.Println(unsafe.Sizeof(s))
}
输出结果:
0
struct {} {}是一个复合字面量,它构造了一个struct {}类型的值,该值也是空。
func main() {
fmt.Println(unsafe.Sizeof(struct{}{}))
}
输出结果:
0
应用场景
实现方法接收者
在业务场景下,我们需要将方法组合起来,代表其是一个 ”分组“ 的,便于后续拓展和维护。
type T struct{}
func (s *T) Call() {
fmt.Println("call")
}
func main() {
var s T
s.Call()
}
实现集合set
Go 语言标准库没有提供 Set 的实现,通常使用 map 来代替。
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"))
}
不发送数据的信道(channel)
基于channels发送消息有两个重要方面:发了消息、发了什么消息。一个强调了通讯的发生,一个强调了通讯的内容。当我们更希望强调通讯发生的时刻时,我们将它称为消息事件。有些消息事件并不携带额外的信息,它仅仅是用作两个goroutine之间的同步,这时候我们可以用struct{}空结构体作为channels元素的类型。用来通知子协程(goroutine)执行任务,或只用来控制协程并发度。