size为0,golang中它可以这么用

73 阅读1分钟

前言

最近在探究各个中间件的原理与实战,也在重温golang的数据结构设计。发现了一个空间为0的结构体struct{},九妹在此分享给大家

例证

package main

import (
	"fmt"
	"unsafe"
)

func main() {
	t := struct{}{}
	fmt.Println(unsafe.Sizeof(t))
	fmt.Printf("t pos: %p\n", &t)

	str := "123"
	fmt.Printf("str pos: %p\n", &str)

	t1 := struct{}{}
	fmt.Println(unsafe.Sizeof(t1))
	fmt.Printf("t1 pos: %p", &t1)
}

输出结果如下

0
t pos: 0x104b68088
str pos: 0x1400010a230
0
t1 pos: 0x104b68088

分析

空结构体,size为0。在golang的源码中,可以看到runtime包下,zerobase这个struct

// base address for all 0-byte allocations
var zerobase uintptr

zerobase是所有空元素的基本地址

用法

看到这里,你可能会有疑问,size为0,这类元素有何用法?在golang的数据结构中,没有提供hashSet这类基本结构,而空struct,可以提供类似帮助

结合map

例如当需要对student进行去重时,可以按这个方式初始化map,赋值元素。

stuMap := make(map[string]struct{})
stuMap["001"] = struct{}{}

扩展

除了map,还可以在channel中使用该结构,达到节省内存的目的。