为了账号安全,请及时绑定邮箱和手机立即绑定

尝试了 monad 模式,但仍然有重复的错误处理

尝试了 monad 模式,但仍然有重复的错误处理

Go
慕妹3146593 2023-07-10 15:15:32
请注意,我如何添加可err通过Error()方法访问的字段,徒劳地尝试减少 if 错误。上面的代码更简单,但是 ReadRLP() 函数与仅返回错误没有什么不同。有什么模式可以帮助解决这个问题吗?type namePreclaimRLP struct {    ObjectTag         uint    RlpMessageVersion uint    AccountID         []uint8    AccountNonce      uint64    CommitmentID      []uint8    Fee               big.Int    TTL               uint64    err               error}func (n *namePreclaimRLP) ReadRLP(s *rlp.Stream) (aID, cID string) {    blob, err := s.Raw()    if err != nil {        n.err = err    }    err = rlp.DecodeBytes(blob, n)    if err != nil {        n.err = err    }    _, aID, err = readIDTag(n.AccountID)    if err != nil {        n.err = err    }    _, cID, err = readIDTag(n.CommitmentID)    if err != nil {        n.err = err    }    return aID, cID}func (n *namePreclaimRLP) Error() (err error) {    return n.err}
查看完整描述

2 回答

?
皈依舞

TA贡献1851条经验 获得超3个赞

你的代码没有按照编写的方式编译(有很多缺失的类型),所以我无法完全测试这段代码,但我希望沿着这些路线返回一些东西,以典型的 Go 方法返回,而不是使其err成为另一种类型,很不寻常并且有点令人困惑:


func (n *namePreclaimRLP) ReadRLP(s *rlp.Stream) (aID, cID string, err error) {

    var blob SomeType // Depends on what blob actually is

    if blob, err = s.Raw(); err != nil {

        return

    }


    if err = rlp.DecodeBytes(blob, n); err != nil {

        return

    }


    if _, aID, err = readIDTag(n.AccountID); err != nil {

        return

    }


    _, cID, err = readIDTag(n.CommitmentID)


    return

}

我会删除Error()这里的函数和err字段。namePreclaimRLP不是一种错误。感觉你正在滥用那里的界面。


查看完整回答
反对 回复 2023-07-10
?
冉冉说

TA贡献1877条经验 获得超1个赞

使用以下代码可以减少代码量,并通过返回错误来保留更惯用的 API。


func (n *namePreclaimRLP) ReadRLP(s *rlp.Stream) (aID, cID string, err error) {

    se := func(e error) {

       if e != nil {

          err = e

       }

    }


    blob, e := s.Raw()

    se(e)

    se(rlp.DecodeBytes(blob, n))

    _, aID, e = readIDTag(n.AccountID)

    se(e)

    _, cID, e = readIDTag(n.CommitmentID)

    se(e)

    return

}


查看完整回答
反对 回复 2023-07-10
  • 2 回答
  • 0 关注
  • 90 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信