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?
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: