oop - 对象变量在 Golang 中没有得到更新

标签 oop go

这个问题在这里已经有了答案:





How to set and get fields in struct's method

(3 个回答)


2年前关闭。




我创建了一个结构 Person和方法AddPerson它充当该结构的构造函数。

package main

import "fmt"

type Person struct {
    name string
    salary int
    balance int
}

func AddPerson(name string, salary int) Person {
    p := Person{}
    p.name = name
    p.salary = salary
    p.balance = salary

    return p
}

之后我添加了一个方法 spendMoney它执行以下操作:
func (p Person) spendMoney(amountSpent int) {
    p.balance = p.salary - amountSpent
    fmt.Println("The amount spent is : ", amountSpent)
    fmt.Println("Balance left is : ", p.balance)
}

main方法如下图:
func main(){
    p1 := AddPerson("A", 1500)
    p2 := AddPerson("B", 2000)
    p1.spendMoney(500)
    p2.spendMoney(1000)
    fmt.Println(p1.balance) //wanted to check the balance of p1 after spending.
}

我想在他花完钱后查看p1的余额,但它仍然显示和以前一样(即1500)。我是 Golang 的新手,来自 Python 背景,这种方式工作得很好。

最佳答案

您需要在指向对象的指针上定义方法,而不是对象的值。

func (p *Person) spendMoney(amountSpent int) {
    p.balance = p.salary - amountSpent
}

与 Python 不同,您必须区分值和 pointers。 .值基本上是变量的副本,修改它们不会使变量本身发生变化,除非显式地为该变量分配一个新值。
This tutorial可能会让你更好地理解这一点。

关于oop - 对象变量在 Golang 中没有得到更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61181930/

相关文章:

c# - 在调用基本构造函数之前计算值

go - 如何在不破坏客户端代码的情况下拆分大包?

go - 读取二进制文件时切换字节顺序

go - 我如何使用单独的 API 服务器处理 Nuxt 中的 oauth?

string - 是否可以将 Golang 字符串的内存 "safely"归零?

firebase - 无法在返回值中使用类型的变量

javascript - 模拟鼠标移动,不起作用

php - 从mysql数据库获取多维数组

javascript - 如何使用 prototype.js 在回调函数中添加参数?

php - 开发强大的应用程序