登录
首页 >  Golang >  Go问答

按值接收器与按指针接收器混淆

来源:stackoverflow

时间:2024-04-13 13:54:29 145浏览 收藏

大家好,今天本人给大家带来文章《按值接收器与按指针接收器混淆》,文中内容主要涉及到,如果你对Golang方面的知识点感兴趣,那就请各位朋友继续看下去吧~希望能真正帮到你们,谢谢!

问题内容

我写了一个简单的堆栈实现。这按预期工作。

package main

import "fmt"

type stack struct {
    data []interface{}
}

func (s *stack) isempty() bool {
    return len(s.data) == 0
}

func (s *stack) push(item interface{}) {
    s.data = append(s.data, item)
    //fmt.println(s.data, item)
}

func (s *stack) pop() interface{} {
    if len(s.data) == 0 {
        return nil
    }
    index := len(s.data) - 1
    res := s.data[index]
    s.data = s.data[:index]
    return res
}

func main() {
    var stack stack

    stack.push("this")
    stack.push("is")
    stack.push("sparta!!")

    for len(stack.data) > 0 {
        x := stack.pop()
        fmt.println(x)
    }
}

但是,如果我将这三个方法从指针接收器更改为值接收器,如下所示。然后 main 不打印任何东西。似乎每次我调用push方法时,堆栈都会重新初始化。这是为什么?

func (s Stack) isEmpty() bool {
func (s Stack) push(item interface{}) {
func (s Stack) pop() interface{} {

解决方案


在值接收器中,Go 制作变量的副本并对副本进行更改。 仅在参考接收器中,实际的 stack 变量才会更新。

欲了解更多详情, https://tour.golang.org/methods/4

到这里,我们也就讲完了《按值接收器与按指针接收器混淆》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于的知识点!

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