go - 值接收者与指针接收者混淆
问题描述
我写了一个简单的堆栈实现。这按预期工作。
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 制作变量的副本并对副本进行更改。只有在参考接收器中,实际stack
变量才会更新。
推荐阅读
- python - Python 上的 SSL 问题
- python - 如何忽略lookbehind中的特定单词?
- arrays - 合并数组内的对象
- c# - 如何在 C# 中从 Pipeline.Invoke 转换 PSCustomObject
- python-3.x - 如何从 Azure 函数应用发送电子邮件?
- php - Woocommerce 根据所选变量隐藏/显示变量
- terraform-provider-aws - Terraform 脚本在创建新的之前破坏先前创建的 ec2
- python - 每当我尝试通过 Django 中的表单编辑任何条目时,我都会收到“AttributeError”
- asp.net-mvc - 我是 Asp.Net 的新手,我刚刚完成了我的第一个应用程序。如何部署到 IIS 服务器
- excel - 确定日期是否在某个范围内