当前位置: 首页 > 面试题库 >

为什么映射值不可寻址?

濮阳立果
2023-03-14
问题内容

在玩Go代码时,我发现映射值不可寻址。例如,

package main
import "fmt"

func main(){
    var mymap map[int]string = make(map[int]string)
    mymap[1] = "One"
    var myptr *string = &mymap[1]
    fmt.Println(*myptr)
}

产生错误

mapaddressable.go:7:无法获取mymap [1]的地址

而代码,

package main
import "fmt"

func main(){
    var mymap map[int]string = make(map[int]string)
    mymap[1] = "One"
    mystring := mymap[1]
    var myptr *string = &mystring
    fmt.Println(*myptr)
}

工作完美。

为什么会这样呢?为什么Go开发人员选择使某些值无法解决?这是语言的缺点还是功能?

编辑 :来自C ++背景,我不习惯于这种not addressable流行趋势。例如,以下代码可以正常工作:

#include<iostream>
#include<map>
#include<string>
using namespace std;
int main(){
    map<int,string> mymap;
    mymap[1] = "one";
    string *myptr = &mymap[1];
    cout<<*myptr;
}

如果有人可以指出为什么在Go中无法实现(或故意没有实现)相同的 寻址 能力,那就太好了。


问题答案:

好吧,我不知道地图的内部Go实现,但很可能它是一种哈希表。因此,如果您获取并保存其中一个条目的地址,然后再放入其他条目,则您保存的地址可能无效。这是由于当负载系数超过某个阈值并且哈希表需要增长时,哈希表的内部重组。
因此,我猜不允许它采用其中一项的地址以避免这种错误。



 类似资料:
  • 我只想用hadoop mapreduce来排序我的日志行。我将该行的所有字段作为输出键,并将输出值设置为null。但是当运行时,在第行出现空指针异常 所以为什么hadoop映射的输出值不能为空?为什么hadoop reduce的输出值可以(我测试过)?

  • 问题内容: 我尝试创建映射,期望它会自动增长。如手册页中所指定: MAP_GROWSDOWN 该标志用于堆栈。它向内核虚拟内存系统指示该映射应在内存中向下扩展。返回地址比在进程的虚拟地址空间中实际创建的内存区域低一页。 触摸映射下方的“防护”页面中的地址,将导致 映射增加一页 。可以重复这种增长,直到该映射增长到下一个较低映射的高端的页面内为止,此时触摸“防护”页面将产生 信号。 因此,我编写了以

  • 多值映射不存在的原因是什么?会不会是什么过滤?对于未知数量的参数,有什么可供选择的? 更新是由于泽西+Spring的一个特殊性。在这个答案中可以找到解决方法。

  • 问题内容: 检查以下代码段: http://play.golang.org/p/xusdITxgT- 为什么会这样呢?因为我的论点之一必须是切片地址。 也许我没有对每个人都说清楚。 上面的代码就是为什么我需要一个分片地址。 结果变量在这里是我需要的。现在通常我可以做到 但是现在SomeStruct是动态的,我需要使用reflect.MakeSlice创建切片 而且它在上出错:结果必须是一个分片地址

  • 问题内容: 我发现切片图功能和通道经常一起作为 参考类型 提及。但是我注意到,切片的东西不会表现出参考行为,就像它们会过时一样: 要么 通常,我会通过牢记切片描述符实现的内部组件来理解这一点:切片值可以视为len,cap和data指针的结构。 但是地图值永远不需要像 为什么?映射值仅仅是指向映射描述符的指针吗?如果是这样,为什么还不这样做呢? 问题答案: 在Go中,没有像C ++中那样的引用类型。

  • 我使用mapstruct在两个Calses之间进行映射:CandidateDTO和CandidateDTO。 我在这里的问题是,当映射时,所有DTO字段都为空,因为没有生成映射字段。 请帮忙。