Golang map之reflexivekey函数详解

定义和实现

@(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

猜你喜欢

转载自blog.csdn.net/fengshenyun/article/details/100713066
今日推荐