Hi,
I stumbled across this weird behavior and I wonder whether this is a bug.
Here is the simplified version of the problem (Playground link
https://play.golang.org/p/mch6NQdTpr5):
package main
import (
"fmt"
)
func main() {
str := MyString("World")
var formatter Format
Print(formatter, str) //ERROR: have Format(StringerA) string, want
Format(StringerB) string
}
//StringerA and StringerB are identical. Some may wonder why declare
identical interfaces in the same package.
//In a real world example, they live in different packages. StringerA
resides in Package A and StringerB is in Package B.
type StringerA interface {
String() string
}
type StringerB interface {
String() string
}
//MyString is the concrete implementation of Stringer. It applies to both
StringerA and StringerB.
type MyString string
func (m MyString) String() string {
return string(m)
}
//Then, we have the Formatter. FormatterA and FormatterB are supposed to be
identical. They both accept a Stringer.
//FormatterA accepts StringerA, because they are in the same package.
FormatterB accepts StringerB. Package A and Package B
//are probably authored by different people and they define their own
Stringer. However, since we are dealing with interfaces,
//so behaviour-wise, they are supposed to be identical. They format a
Stringer.
type FormatterA interface {
Format(StringerA) string
}
type FormatterB interface {
Format(StringerB) string
}
//Format is the concrete implementation of Formatter. In this case, Format
is implemented by the author of Package A. Let's call him Author A.
//Hence, we see StringerA there because StringerA is Author A definition of
Stringer. However, it is intended to work on any Stringer.
type Format struct{}
func (f Format) Format(s StringerA) string {
return fmt.Sprintf("Hello %s!", s)
}
//Print is written by Author B. She uses FormatterB and StringerB. Those
interfaces are the 'contracts' she requires for her function to work.
//Her intention is for Print to work with any Formatter and any Stringer.
However, Go apparently treat FormatterA and FormatterB as being different.
//Is this a bug?
func Print(f FormatterB, s StringerB) {
fmt.Println(f.Format(s))
}
Thanks
Henry
--
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 [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/golang-nuts/e5eb2946-e865-40cd-b1f7-3d445d423e00%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.