首页 > 解决方案 > 有没有更好的方法来迭代结构的字段?

问题描述

我从 JSON 文件中填充了这两个结构:

type transaction struct {
    Datetime time.Time       `json:"datetime"`
    Desc     string          `json:"desc"`
    Cash     decimal.Decimal `json:"cash"`
}

type branch struct {
    BranchName    string        `json:"branch-name"`
    Currency      string        `json:"currency"`
    Deposits      []transaction `json:"deposits"`
    Withdrawals   []transaction `json:"withdrawals"`
    Fees          []transaction `json:"fees"`
}

我需要实现一个方法来返回 和 的所有字段的总和,CashDeposits我不确定如何将它们抽象为“带有字段的事物切片”。我当前的实现只是重复相同的代码三遍:WithdrawalsFeesCash

func (b branch) getCash(datetime time.Time) decimal.Decimal {
    cash := decimal.NewFromFloat(0)
    for _, deposit := range b.Deposits {
        if deposit.Datetime.Before(datetime) {
            cash = cash.Add(deposit.Cash)
        }
    }
    for _, withdrawal := range b.Withdrawals {
        if withdrawal.Datetime.Before(datetime) {
            cash = cash.Add(withdrawal.Cash)
        }
    }
    for _, fee := range b.Fees {
        if fee.Datetime.Before(datetime) {
            cash = cash.Add(fee.Cash)
        }
    }
    return cash
}

有一个更好的方法吗?

标签: gostruct

解决方案


通过循环切片切片来消除重复代码:

for _, transactions := range [][]transaction{b.Deposits, b. Withdrawals, b.Fees} {
    for _, transaction := range transactions {
        if transaction.Datetime.Before(datetime) {
            cash = cash.Add(transaction.Cash)
        }
    }
}

推荐阅读