教程集 www.jiaochengji.com
教程集 >  Golang编程  >  golang教程  >  正文 Golang map之reflexivekey函数详解

Golang map之reflexivekey函数详解

发布时间:2021-04-18   编辑:jiaochengji.com
教程集为您提供Golang map之reflexivekey函数详解等资源,欢迎您收藏本站,我们将为您提供最新的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的底层实现

[关闭]
~ ~