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


    一、空结构体基础

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

    • 1、所有空结构体地址都是一样的
    • 2、大小都为0(最独特的)
    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("......")
    	}
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    输出结果:
    a address 0x10030c028, size 0
    b address 0x10030c028, size 0

    二、应用场景一 充当 set

    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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    三、应用场景二 协程阻塞

    1、协程阻塞的三种方式

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

    2、channel方式阻塞 main

    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
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
  • 相关阅读:
    Django-图书管理系统(含源码)
    ch55xduino
    2022级大学新生-电脑推荐
    java boot项目读取yml配置信息
    新手学习Cesium的几点建议
    深度学习开发环境及编程基础
    NoSQL之readis配置与优化(启示录)
    白盒测试(路径覆盖、判定覆盖、条件覆盖)
    Linux执行脚本报错:-bash: ./bin/start.sh: /bin/bash^M: 坏的解释器: 没有那个文件或目录
    【ArcGIS微课1000例】0046:制图表达(1)---什么是制图表达?
  • 原文地址:https://blog.csdn.net/wanglei19891210/article/details/133647864