登录
首页 >  Golang >  Go问答

确保结构体字段的必备性,如何做到和接口对方法所做的一样?

来源:stackoverflow

时间:2024-03-14 14:15:25 226浏览 收藏

学习Golang要努力,但是不要急!今天的这篇文章《确保结构体字段的必备性,如何做到和接口对方法所做的一样?》将会介绍到等等知识点,如果你想深入学习Golang,可以关注我!我会持续更新相关文章的,希望对大家都能有所帮助!

问题内容

我有几个事务结构:

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() 这样的 getter 函数并从中创建一个接口,但这并没有更好。还是其他人就是这样做的?


解决方案


你不知道。如果您不关心特定类型(即,您可以使用接口),那么您不关心数据,只关心行为(这就是接口仅指定方法的原因)。如果您关心数据,那么您已经深入了解类型的内部结构,并且应该使用特定的具体类型(或使用类型断言/类型开关来获取它)。这不是 Go 特有的;大多数语言不允许在接口中指定字段。

吸气剂并不是最糟糕的事情。您还可以将需要直接访问的字段封装到它们自己的结构类型中,并为其提供一个 getter(如果您想要一起使用多个相关字段)。最后,您可以重新设计整体设计以消除或迁移需求。这里没有足够的上下文来提出硬性建议,但总体猜测,似乎您可能有一些东西可以将这些交易写入某个地方,并且它是您关心的要写入的内容的大小。由于您似乎正在尝试获取其最终长度的方法中执行所有相关处理来生成消息,因此您不能将消息生成为 []byte 并获取其长度,然后当你做的时候使用相同的输出...无论你用这些做什么?

今天关于《确保结构体字段的必备性,如何做到和接口对方法所做的一样?》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>