猿问

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

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


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)

    }

}

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


func (s Stack) isEmpty() bool {

func (s Stack) push(item interface{}) {

func (s Stack) pop() interface{} {


交互式爱情
浏览 118回答 1
1回答

Qyouu

在值接收器中,Go 制作变量的副本并对副本进行更改。只有在参考接收器中,实际stack变量才会更新。更多详情, https://tour.golang.org/methods/4
随时随地看视频慕课网APP

相关分类

Go
我要回答