Golang:如何实现传输方法/功能

Golang:如何实现传输方法/功能,go,Go,我拥有以下域。我们如何实现可以将金额从一个帐户转移到另一个帐户的转账功能。我应该能够从储蓄转为支票,反之亦然。我的OOP世界,一个超级类型使它更容易。我想知道我们如何在围棋中做到这一点 type AccountData struct { Num string Name string OpenDate time.Time Balance float64 } type SavingsAccount struct { InterestRat

我拥有以下域。我们如何实现可以将
金额
从一个帐户转移到另一个帐户的
转账
功能。我应该能够从储蓄转为支票,反之亦然。我的OOP世界,一个超级类型使它更容易。我想知道我们如何在围棋中做到这一点

type AccountData struct {
    Num      string
    Name     string
    OpenDate time.Time
    Balance  float64
}

type SavingsAccount struct {
    InterestRate float32
    AccountData
}

type CheckingAccount struct {
    TransactionFee float32
    AccountData
}

type Account interface {
    Deposit(amount float64) error
    Withdraw(amount float64) error
}

//constructor functions
func OpenSavingsAccount(no string, name string, openingDate time.Time) SavingsAccount {
    return SavingsAccount{
        AccountData: AccountData{Num: no,
            Name:     name,
            OpenDate: openingDate,
        },
        InterestRate: 0.9,
    }
}

func OpenCheckingAccount(no string, name string, openingDate time.Time) CheckingAccount {
    return CheckingAccount{
        AccountData: AccountData{Num: no,
            Name:     name,
            OpenDate: openingDate,
        },
        TransactionFee: 0.15,
    }
}

//Account methods
func (acct *SavingsAccount) Withdraw(amount float64) error {
    if acct.Balance < amount {
        return errors.New("Not enough money to withdraw")
    }
    acct.Balance = acct.Balance - amount
    return nil
}


func (acct *SavingsAccount) Deposit(amount float64) error {
    fmt.Printf("Depositing %f \n", amount)
    acct.Balance = acct.Balance + amount
    return nil
}
func (acct *CheckingAccount) Deposit(amount float64) error {
    fmt.Printf("Depositing %f \n", amount)
    acct.Balance = acct.Balance + amount
    return nil
}
func (acct *CheckingAccount) Withdraw(amount float64) error {
    if acct.Balance < amount {
        return errors.New("Not enough money to withdraw")
    }
    acct.Balance = acct.Balance - amount
    return nil
}
类型AccountData结构{
Num字符串
名称字符串
开放日期时间
余额浮动64
}
类型SavingsAccount结构{
利率浮动32
会计数据
}
类型CheckingAccount结构{
交易费浮动32
会计数据
}
类型帐户接口{
存款(金额浮动64)错误
取款(金额浮动64)错误
}
//构造函数
func OpenSavingsAccount(无字符串、名称字符串、openingDate time.time)SavingsAccount{
返回储蓄帐户{
AccountData:AccountData{Num:no,
姓名:姓名,,
OpenDate:openingDate,
},
利率:0.9,
}
}
func OpenCheckingAccount(无字符串、名称字符串、openingDate time.time)CheckingAccount{
返回检查帐户{
AccountData:AccountData{Num:no,
姓名:姓名,,
OpenDate:openingDate,
},
交易费用:0.15,
}
}
//记帐方法
func(账户*储蓄账户)支取(金额浮动64)错误{
如果账户余额<金额{
返回错误。新建(“没有足够的钱取款”)
}
账户余额=账户余额-金额
归零
}
func(账户*储蓄账户)存款(金额浮动64)错误{
格式打印(“存款%f\n”,金额)
账户余额=账户余额+金额
归零
}
func(账户*检查账户)存款(金额浮动64)错误{
格式打印(“存款%f\n”,金额)
账户余额=账户余额+金额
归零
}
func(科目*检查科目)支取(金额浮动64)错误{
如果账户余额<金额{
返回错误。新建(“没有足够的钱取款”)
}
账户余额=账户余额-金额
归零
}

作为练习,设计一个用于处理事务的接口可能是值得的。

因此它应该是一个函数。我试图将其实现为一种方法,即转账是帐户接口类型的一部分。@AravindR.Yarram:将指针传递到您的结构:谢谢。为什么指针工作而常规引用不工作?我无法理解原因。@AravindR.Yarram:因为
传输
接口方法是在
SavingsAccount
(acct*SavingsAccount)
)和
CheckingAccount
(acct*CheckingAccount)
)的指针上定义的,而不是它们的值(
(acct>(acct SavingsAccount)
(账户检查账户)
)。
func Transfer(to, from Account, amount float64) error {
    if err := from.Withdraw(amount); err != nil {
        return err
    }
    if err := to.Deposit(amount); err != nil {
        if err := from.Deposit(amount); err != nil {
            // `from` should be alerted that their money
            // just vanished into thin air
        }
        return err
    }
    return nil
}