Go中结构体内存

  1. 空结构体不占用内存。可以用来做一些有趣的妙用,例如利用map的key消重,我们并不关心值
  2. 结构体成员变量的类型和顺序影响内存占用大小,整数边界对齐问题
  3. go中的map不是并发安全的,可以使用sync.map替换
package main

import (
	"fmt"
	"unsafe"
)

type Set map[string]struct{}

func (s Set) Append(v string) {
	s[v] = struct{}{}
}

func (s Set) Delete(v string) {
	delete(s, v)
}

func (s Set) Exist(v string) bool {
	_, ok := s[v]
	return ok
}

func main() {

	var t1 struct{}

	t2 := struct {
		a uint32
		b uint64
		c uint32
	}{1, 1, 1}

	t3 := struct {
		a uint64
		b uint32
		c uint32
	}{1, 1, 1}

	// 空结构体不占用内存,糟糕的成员变量顺序,正确的成员变量顺序
	fmt.Println(unsafe.Sizeof(t1), unsafe.Sizeof(t2), unsafe.Sizeof(t3))

	s := Set{}

	// 不管增加多少个成员函数,s的初始内存就占用这么大
	fmt.Println(unsafe.Sizeof(s))

	s.Append("a")
	s.Append("a")
	s.Append("b")
	s.Delete("b")

	fmt.Println(s.Exist("a"), s.Exist("b"))
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值