Not sure exactly how to describe this issue or the right words to use when talking about some of the concepts. Here's a best effort.
Given a type T that implements interfaces A1 and A2, T is an acceptable input for any function that requires an A1 or A2 as input. Given A1 and A2 are identical in definition, the return value of a function that returns and A1 is acceptable as input to a function at requires an A2, and vice versa. However, a type T2 defined as a function that accepts an A1 cannot be satisfied by a function that accepts an A2. To illustrate, I've put together a playground that encounters this issue: https://play.golang.org/p/nsFCxP3T8H. To give a slightly more concrete example of why this is a pain point, there is a common pattern among HTTP request routing libraries to define a context sensitive alternative to the http.Handler interface defined as: type HanderC interface { ServeHTTPC(context.Context, http.ResponseWriter, *http.Request) } A benefit of the consistency across libraries is that my context sensitive handlers are portable to virtually any routing library I want without modification. However, each of these libraries also defines a form of middleware which wrap a HandlerC. The typical pattern for these libraries is to define a new type, Middleware, that is a function signature like func(HandlerC) HandlerC. A problem with this approach is that middleware become non-portable between libraries because a middleware defined as func(A.HandlerC) A.HandlerC cannot be used to satisfy func(B.HandlerC) B.HandlerC. This constraint feels odd because the interfaces required in the function signatures are equivalent and, outside the context of that type definition, are treated as equivalent in all ways. It is additionally frustrating because the error message shown during compilation seems to indicate the names of the types are being used for validation rather than the interfaces themselves. Is this an expected behaviour with rationale behind the implementation or is this considered a bug that will be resolved in future versions of go? Alternatively, what strategies exist for overcoming this issue when attempting to write code that is compatible with multiple, equivalent type definitions? -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.