Golang map之reflexivekey函数详解

本文深入探讨了Go语言中MapKey的反身性概念,解释了在何种条件下key类型可以被认为是反身的。文章指出,除了常见的整型、布尔型、字符串等类型外,float32、float64、complex64、complex128和interface类型在作为MapKey时并不具备反身性,这为理解Go语言的内存管理和并发编程提供了关键视角。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

定义和实现

@(src/runtime/type.go:382)

func (mt *maptype) reflexivekey() bool { // true if k==k for all keys
	return mt.flags&4 != 0
}

reflexive中文意思是反身的、反射性的,从注释上看是说当k==k时,表示是reflexivekey,但有字段k!=k吗?还真有,像浮点数,在计算机里面是不能够直接用等号比较的,而是在一个误差范围内相等。详细代码如下:

@(src/cmd/compile/internal/gc/reflect.go:1024)

func isreflexive(t *types.Type) bool {
	switch t.Etype {
	case TBOOL,
		TINT,
		TUINT,
		TINT8,
		TUINT8,
		TINT16,
		TUINT16,
		TINT32,
		TUINT32,
		TINT64,
		TUINT64,
		TUINTPTR,
		TPTR,
		TUNSAFEPTR,
		TSTRING,
		TCHAN:
		return true

	case TFLOAT32,
		TFLOAT64,
		TCOMPLEX64,
		TCOMPLEX128,
		TINTER:
		return false

	case TARRAY:
		return isreflexive(t.Elem())

	case TSTRUCT:
		for _, t1 := range t.Fields().Slice() {
			if !isreflexive(t1.Type) {
				return false
			}
		}
		return true

	default:
		Fatalf("bad type for map key: %v", t)
		return false
	}
}

最后可以得出结论:只要key类型是float32\float64\complex64\complex64\interface,或字段里面包含这些类型的都是inreflexive

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值