Golang之空结构体

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{}是零内存占用,所以没有额外的内存开销

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值