【golang】go 空结构体 详解 空结构体内容占用及大小

一、空结构体基础

空结构实例 和 空结构体变量 本质是一样的

  • 1、所有空结构体地址都是一样的
  • 2、大小都为0(最独特的)
go 复制代码
package main

import (
	"fmt"
	"time"
	"unsafe"
)

type EST struct {
}

func main() {
	// 一、基础
	// 空结构实例 和 空结构体变量 本质是一样的
	// 1、所有空结构体地址都是一样的
	// 2、大小都为0(最独特的)
	var a EST
	var b struct{}
	fmt.Printf("a address %p, size %d \n", &a, unsafe.Sizeof(a))
	fmt.Printf("b address %p, size %d \n", &b, unsafe.Sizeof(b))
	if a == b {
		fmt.Println("......")
	}
}

输出结果:

a address 0x10030c028, size 0

b address 0x10030c028, size 0

...

二、应用场景一 充当 set

go 复制代码
package main

import (
	"fmt"
	"time"
	"unsafe"
)

type EST struct {
}

func main() {
	// 二、应用场景一:充当 set
	set := make(map[string]interface{}, 10)
	set["A"] = EST{}
	set["B"] = struct{}{}

	fmt.Println(len(set))
	for k, _ := range set {
		fmt.Println(k)
	}
}

三、应用场景二 协程阻塞

1、协程阻塞的三种方式

  • 1、一种是通过 waitGroup:通过调wait函数把本协程阻塞掉
  • 2、通过 time.Sleep()
  • 3、使用 管道 channel 读写阻塞

2、channel方式阻塞 main

go 复制代码
package main

import (
	"fmt"
	"time"
	"unsafe"
)

type EST struct {
}

func main() {
	// 三、应用场景二:协程阻塞
	// 1、一种是通过 waitGroup:通过调wait函数把本协程阻塞掉
	// 2、通过 time.Sleep()
	// 3、使用 管道 channel 读写阻塞

	// 下面展示为channel方式阻塞 main
	ctra := make(chan EST, 0)
	go func() {
		time.Sleep(3 * time.Second)
		fmt.Println("等待子协程执行完成!!!")
		ctra <- EST{}
	}()
	fmt.Println("---------")
	<-ctra
}
相关推荐
Scott9999HH3 小时前
【IIoT流量实战】蒸汽管道阀门全关却仍有流量?用 Python 实现涡街信号 FFT 频谱分析与温压全补偿积算网关,深度拆解靠谱的涡街流量计厂家硬核技术标准
开发语言·python
GetcharZp4 小时前
抛弃低效SSH!这套Ansible+Web可视化神器,让你天天准点下班!
后端
码智社4 小时前
AES加密原理详解及Java实现加解密实战
java·开发语言
AI云海4 小时前
python 列表、元组、集合和字典
开发语言·python
萧瑟余晖5 小时前
JDK 26 新特性详解
java·开发语言
马优晨6 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
weixin_446260857 小时前
HACO:面向动态部署环境的对冲式智能计算可靠多智能体调度框架
后端·python·flask
人邮异步社区8 小时前
怎么把C语言学到精通?
c语言·开发语言
心平气和量大福大8 小时前
C#-WPF-控件-TextBox 数据绑定
开发语言·c#·wpf