У меня есть несколько структур транзакций:
SpendTx
NameTransferTx
NameUpdateTx
...
Я бы хотел оценить размер этих структур, исключая поле Fee. Все они имеют поле структуры Fee. В настоящее время для каждой структуры у меня есть этот метод:
func (tx *NameTransferTx) sizeEstimate() (int, error) {
feeRlp, err := rlp.EncodeToBytes(tx.Fee)
if err != nil {
return 0, err
}
feeRlpLen := len(feeRlp)
rlpRawMsg, err := tx.RLP()
if err != nil {
return 0, err
}
return len(rlpRawMsg) - feeRlpLen + 8, nil
}
Это много дублированного кода, все потому, что я не могу написать что-то вроде этого:
type Tx interface {
RLP() ([]byte, error)
Fee utils.BigInt // Golang won't allow this
}
func estimateSizeOfTx(tx Tx) (int, error) {
feeRlp, err := rlp.EncodeToBytes(tx.Fee)
if err != nil {
return 0, err
}
feeRlpLen := len(feeRlp)
rlpRawMsg, err := tx.RLP()
if err != nil {
return 0, err
}
return len(rlpRawMsg) - feeRlpLen + 8, nil
}
Конечно, я мог бы написать функцию получения, подобную getFee()
, и сделать интерфейс из этого, но это не лучше. Или это так делают другие люди?