z什么是空结构体
空结构体是指没有任何字段的结构体,格式为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{}指向的内存地址是一样的
- 无状态
由于空结构体不包含任何字段,因此它不能有状态
空结构体的常见用法
- Goroutine信号传递jie
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{}是零内存占用,所以没有额外的内存开销