空结构体是指没有任何字段的结构体,格式为struct{},一般定义有两种方式
// 匿名空结构体
var x struct{}
//命名空结构体
type Estruct struct{}
var x Estruct
空结构体的特点
- 零内存占用
package main
import (
"fmt"
"unsafe"
)
var x struct{}
var y int
var z string
func main() {
fmt.Println(unsafe.Sizeof(x)) //0
fmt.Println(unsafe.Sizeof(y)) //8
fmt.Println(unsafe.Sizeof(z)) //16
}
//从该代码运行结果可以看出,struct{}的内存占用是0字节,int是8字节,string是16字节
- 内存地址相同
package main
import (
"fmt"
)
func main() {
var x struct{}
var y struct{}
fmt.Printf("%p\n", &x) // 0xeab418
fmt.Printf("%p\n", &y) // 0xeab418
}
//从该代码运行结果看,x与y的struct{}指向的内存地址是一样的
- 无状态
由于空结构体不包含任何字段,因此它不能有状态
空结构体的常见用法func main() {
quit := make(chan struct{})
go func() {
fmt.Println("工作中...")
time.Sleep(3 * time.Second)
// 关闭退出信号
close(quit)
}()
// 阻塞,等待退出信号被关闭
<-quit
fmt.Println("已收到退出信号,退出中...")
}
type Person interface {
Hello()
Bye()
}
type xyz struct{}
func (c xyz) Hello() {
fmt.Println("你好")
}
func (c xyz) Bye() {
fmt.Println("再见")
}
这段代码例子实现了Person接口,定义了一组方法(Hello()和Bye()),由于struct{}是零内存占用,所以没有额外的内存开销