定义和实现
@(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。