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 Go | heap.Interface vs sort.Interface中的指针与值接收器_Pointers_Go - Fatal编程技术网

Pointers Go | heap.Interface vs sort.Interface中的指针与值接收器

Pointers Go | heap.Interface vs sort.Interface中的指针与值接收器,pointers,go,Pointers,Go,我在heap.Interface包下遇到了priorityqueue示例 链接: 对于heap.Interface所需的Push和Pop函数,在指针接收器上实现。但对于sort.Interface所需的Swap函数,实现是有价值的 为什么会有这种差异 据我所知,Push和Pop是在指针类型上实现的,因为它们需要更改底层数据。但按照这种逻辑,交换也应该在指针类型上实现 交换实现如何以及为什么对值起作用,而Push和Pop不起作用?当需要修改传递的值时,需要指针接收器。在交换的情况下,虽然支持该片的

我在heap.Interface包下遇到了priorityqueue示例

链接:

对于heap.Interface所需的Push和Pop函数,在指针接收器上实现。但对于sort.Interface所需的Swap函数,实现是有价值的

为什么会有这种差异

据我所知,Push和Pop是在指针类型上实现的,因为它们需要更改底层数据。但按照这种逻辑,交换也应该在指针类型上实现


交换实现如何以及为什么对值起作用,而Push和Pop不起作用?

当需要修改传递的值时,需要指针接收器。在交换的情况下,虽然支持该片的数组会被修改,但作为片的值本身不会被修改

在Push和Pop的情况下,切片确实会被修改,因为在这两种情况下,长度都会发生变化,而在Push的情况下,如果底层阵列已达到其容量,则可能会被新阵列替换。

查看Push实现:

func (pq *PriorityQueue) Push(x interface{}) {
    n := len(*pq)
    item := x.(*Item)
    item.index = n
    *pq = append(*pq, item)  // Here, the slice is assigned a new value
}

Push和Pop修改底层切片以及优先级队列的切片元素,而Swap只交换切片中的两个元素,不会更改切片本身。因此,Swap可以与值接收器一起工作。

在内部,slice变量保存长度、容量和指向数据的指针。交换项目会更改数据,但不会更改切片标头中的任何项目。罗斯·考克斯

向片中添加项(如将某些内容推送到堆上)可能需要重新分配阵列,这将改变容量和需要指向的位置

你可能会发现它很有用。还有其他类型,如通道和贴图,它们包含引用,这样您就不需要指针来处理下面的数据