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

请注意,我如何添加可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

}


慕妹3146593
浏览 126回答 2
2回答

皈依舞

你的代码没有按照编写的方式编译(有很多缺失的类型),所以我无法完全测试这段代码,但我希望沿着这些路线返回一些东西,以典型的 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不是一种错误。感觉你正在滥用那里的界面。

冉冉说

使用以下代码可以减少代码量,并通过返回错误来保留更惯用的 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}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go