【问题标题】:Receiver by value vs receiver by pointer confusion [duplicate]按值接收者与按指针混淆接收者[重复]
【发布时间】:2021-04-04 22:40:50
【问题描述】:

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

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{} {

【问题讨论】:

    标签: go


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2017-11-30
      • 1970-01-01
      • 2015-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多