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{}指向的内存地址是一样的
  • 无状态

由于空结构体不包含任何字段,因此它不能有状态

空结构体的常见用法
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{}是零内存占用,所以没有额外的内存开销