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。
到此这篇关于“Golang map之reflexivekey函数详解”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持JQ教程网!您可能感兴趣的文章:
Golang map之reflexivekey函数详解
Go语言--集合(Map)详解
golang之map详解
Golang从入门到放弃200618--Map(1)Map的初始化和基本操作
golang 没有名字参数_说说不知道的Golang中参数传递
请教一个interface格式解析的问题
Golang 踩坑pprof分析
golang map 详解
Golang 中使用多维 map
Golang map的底层实现