登录
首页 >  Golang >  Go问答

为何swap成员函数不需要传入指针?

来源:stackoverflow

时间:2024-02-29 19:15:25 113浏览 收藏

怎么入门Golang编程?需要学习哪些知识点?这是新手们刚接触编程时常见的问题;下面golang学习网就来给大家整理分享一些知识点,希望能够给初学者一些帮助。本篇文章就来介绍《为何swap成员函数不需要传入指针?》,涉及到,有需要的可以收藏一下

问题内容

我是 golang 新手。当我尝试实现第一个 priorityqueue 时,我发现 push 和 pop 函数需要使用成员的指针,但 swap 不需要。

我知道,如果您在成员函数中使用指针,则意味着您可以更改实例本身而不是其副本。但是为什么swap可以使用副本而不是指针呢?

type maxHeap []int

func (max maxHeap) Len() int {
    return len(max)
}

func (max maxHeap) Less(a, b int) bool {
    return max[a] > max[b]
}

func (max maxHeap) Swap(a, b int) {
    max[a], max[b] = max[b], max[a]
}

func (max *maxHeap) Push(a interface{}) {
    *max = append(*max, a.(int))
}
func (max *maxHeap) Pop() interface{} {
    x := (*max)[len(*max)-1]
    *max = (*max)[0 : len(*max)-1]
    return x
}

解决方案


尝试将此作为练习:使用指针接收器编写所有函数。在每个函数中,获取顶部指针的当前值,直到您需要更改通过指针存储的值为止。

因此 swappush 分别变为:

func (p *maxHeap) Swap(a, b int) {
    max := *p
    max[a], max[b] = max[b], max[a]
}
func (p *maxHeap) Push(a interface{}) {
    max := *p
    *p = append(max, a.(int))
}

根据需要重复其他功能。

现在,回顾一下每个转换后的函数。 哪些为 *p 分配了新值?哪些函数从不分配值,而只是继续使用 max

当您回答这个问题时,您应该会发现自己受到启发。

旁注:由于 push 立即将 a 转换为 int,因此可能应该只采用 int。同样,pop 应该只返回 int。或者,请参阅 the standard container/heap package

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于Golang的相关知识,也可关注golang学习网公众号。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>