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
Pointers 地图';s键作为指向结构的指针?(用例)_Pointers_Go - Fatal编程技术网

Pointers 地图';s键作为指向结构的指针?(用例)

Pointers 地图';s键作为指向结构的指针?(用例),pointers,go,Pointers,Go,给定一个结构: type Foo struct { Bar int } 选项1,映射键:struct value map[Foo]bool 选项2,映射键:指向结构的指针 map[*Foo]bool 是否存在我必须选择选项2的情况?即: 内存效率 巨大的结构价值 一般来说,将map的键作为指向struct的指针似乎可行的用例是什么 对于这种特定情况,指针不会真正起作用,因为例如: func main() { m1, m2 := map[Vertex]int{}, m

给定一个结构:

type Foo struct {
    Bar int
}  
选项1,映射键:
struct value

map[Foo]bool 
选项2,映射键:
指向结构的指针

map[*Foo]bool

是否存在我必须选择选项2的情况?即:

  • 内存效率
  • 巨大的结构价值
    一般来说,将map的键作为
    指向struct
    的指针似乎可行的用例是什么

    对于这种特定情况,指针不会真正起作用,因为例如:

    func main() {
        m1, m2 := map[Vertex]int{}, map[*Vertex]int{}
        a, b := Vertex{10}, Vertex{10}
        m1[a], m2[&a] = 10, 10
    
        fmt.Println(m1[a], m1[b], m1[a] == m1[b])
        fmt.Println(m2[&a], m2[&b], m2[&a] == m2[&b])
        fmt.Printf("%p %p", &a, &b)
    }
    

    //编辑问题后再编辑

    使用指针的唯一原因是如果结构的内容不可比较(aka有一个切片或映射等),或者如果它太大,按值使用它会导致性能问题


    IMHO,您当前的案例应该使用值而不是指针。

    我已经重新表述了我的问题,很抱歉我的问题一开始有点模糊。顺便问一下,您是否介意详细说明一下,如果结构的内容不可比,为什么指针是更好的选择?@Roylee,因为它们不能用作键,映射键必须具有可比性。在您的示例中,使用指针可能会较慢。指针的大小与顶点的大小相同,指针使GC工作更困难,并且由于GC需要写障碍,指针上的某些操作更慢。@kostya啊哈!感谢您的见解;)@克斯特亚说,如果我在结构下面有一堆值,那么我应该选择指针吗?@Roylee是的,因为你真的不能用指针作为键,除非你以某种方式跟踪指针(也就是另一个贴图或一个切片),我能想到的指针映射键的唯一用法是,当你能保证相等的对象总是有相同的地址(而且这些对象相对较大)时。如果您将所有对象重复数据消除一次,然后仅通过指针引用它们,那么这可能会更快,并且使用更少的内存。不过,如果没有基准,很难说。