Dictionary 怎么走';s映射哈希函数的工作类型与;“相同”;值导致不同的键?
我知道值是不一样的,所以我对它进行了双重计算,我想知道的是go的映射散列是如何工作的,以便Dictionary 怎么走';s映射哈希函数的工作类型与;“相同”;值导致不同的键?,dictionary,go,hashmap,Dictionary,Go,Hashmap,我知道值是不一样的,所以我对它进行了双重计算,我想知道的是go的映射散列是如何工作的,以便cusKey和a在类型上不同,结果是键不同 主程序包 进口( “fmt” ) 类型键int 常数cusKey=1 常数a int=1 func main(){ dic:=make(映射[接口{}]接口{}) dic[cusKey]=5 dic[a]=6 fmt.Println(dic[cusKey]) fmt.Println(dic[a]) } 输出是 5 6 如何做到这一点?这两个键的值都是1 我知道
cusKey
和a
在类型上不同,结果是键不同
主程序包
进口(
“fmt”
)
类型键int
常数cusKey=1
常数a int=1
func main(){
dic:=make(映射[接口{}]接口{})
dic[cusKey]=5
dic[a]=6
fmt.Println(dic[cusKey])
fmt.Println(dic[a])
}
输出是
5
6
如何做到这一点?这两个键的值都是1
我知道在围棋中如果类型不同,两个值就不同。所以这两个1
是不相同的
但go的地图是怎么做到的?我试图在源代码中的
map.go
中找到,但找不到在哪里实现哈希函数。是否使用类型批注计算键的哈希?键的类型为接口{}
。Go中的接口值有两个字段:基础值的类型描述符和指向值本身的指针。因此,具有不同基础类型的两个接口值不相等,即使基础值被视为相等。a
和cusKey
不能相等,因为它们具有不同的类型a
属于int
类型,cusKey
属于key
类型(其基础类型为int
,但类型不同)
围棋地图要求关键点具有可比性
==
和=必须为键类型的操作数完全定义代码>
dic
映射的键类型是interface{}
,它是一种接口类型,如果
- 界面值具有可比性。如果两个接口值具有相同的动态类型和相同的动态值,或者两者都具有值
nil
,则这两个接口值相等
接口值存储动态类型和值,示意图上是“(值,类型)”对。比较接口值时,也会比较类型,如果它们不匹配,则接口值比较将产生false
。有关接口表示的详细信息,请参见
有关Go的映射的内部信息,请查看。因此,当计算接口{}
的哈希时,映射的哈希函数将使用“(值,类型)”对,因此它们在查找操作中是不同的键?@LiJinyao Yes。添加了一个关于Go地图实现的链接,请查看。j@LiJinyao不知怎的,我的编辑消失了,(重新)现在添加了链接。谢谢!这个链接对我帮助很大。