Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dictionary 怎么走';s映射哈希函数的工作类型与;“相同”;值导致不同的键?_Dictionary_Go_Hashmap - Fatal编程技术网

Dictionary 怎么走';s映射哈希函数的工作类型与;“相同”;值导致不同的键?

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 我知道

我知道值是不一样的,所以我对它进行了双重计算,我想知道的是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

我知道在围棋中如果类型不同,两个值就不同。所以这两个
1
是不相同的


但go的地图是怎么做到的?我试图在源代码中的
map.go
中找到,但找不到在哪里实现哈希函数。是否使用类型批注计算键的哈希?

键的类型为
接口{}
。Go中的接口值有两个字段:基础值的类型描述符和指向值本身的指针。因此,具有不同基础类型的两个接口值不相等,即使基础值被视为相等。

a
cusKey
不能相等,因为它们具有不同的类型
a
属于
int
类型,
cusKey
属于
key
类型(其基础类型为
int
,但类型不同)

围棋地图要求关键点具有可比性

==
=

dic
映射的键类型是
interface{}
,它是一种接口类型,如果

  • 界面值具有可比性。如果两个接口值具有相同的动态类型和相同的动态值,或者两者都具有值
    nil
    ,则这两个接口值相等
接口值存储动态类型和值,示意图上是“(值,类型)”对。比较接口值时,也会比较类型,如果它们不匹配,则接口值比较将产生
false
。有关接口表示的详细信息,请参见


有关Go的映射的内部信息,请查看。

因此,当计算
接口{}
的哈希时,映射的哈希函数将使用“(值,类型)”对,因此它们在查找操作中是不同的键?@LiJinyao Yes。添加了一个关于Go地图实现的链接,请查看。j@LiJinyao不知怎的,我的编辑消失了,(重新)现在添加了链接。谢谢!这个链接对我帮助很大。