dqn8235
dqn8235
2018-02-24 18:23

实施与接口不匹配

  • interface
已采纳

I have an interface:

type Responder interface{
    read()(interface{})
    getError()(error)
    setError(error)
    getTransactionId()(string)
}

And implementation:

type CapacityResponse struct{
    val int32
    err error
    transactionId string
}

func (r *CapacityResponse) getError() error {
    return r.err
}

func (r *CapacityResponse) setError(err error)  {
    r.err = err
}

func (r *CapacityResponse) read() int32  {
    return r.val
}

func (r *CapacityResponse) getTransactionId() string  {
    return r.transactionId
}

But seems CapacityResponse doesn't implement Responder interface. What is mismatched here?

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

1条回答

  • duanjing9739 duanjing9739 3年前

    In the interface the read method returns an interface{} whereas the CapacityResponse returns an int32. Go's interface matching is done strictly on the signature of the function and does not take into consideration that an int32 does implement the interface{}. You can work around this by having two methods:

    // This does the work
    func (r *CapacityResponse) readInt32() int32  {
        return r.val
    }
    // This implements the interface signature
    func (r *CapacityResponse) read() interface{} {
        // No type assertion necessary as int32 is an interface{}
        return r.readInt32()
    }
    

    There was a proposal to do what you wanted to a while ago but it got closed due to it's complexity and issues with the semantics which you can read about here:

    https://github.com/golang/go/issues/12754

    点赞 评论 复制链接分享

为你推荐