Full explanation here: https://blog.merovius.de/posts/2018-06-03-why-doesnt-go-have-variance-in/
On Saturday 6 January 2024 at 11:55:27 UTC John Pritchard wrote: > Hi, > > Thinking about types and their conception, I could avoid the type > assertion boilerplate and rationalize the type membership relationship if > this code compiled. > > Best, > > John > > > On Sat, Jan 6, 2024 at 3:21 AM Tamás Gulácsi <tgula...@gmail.com> wrote: > >> Where does TestObject implement the Comparable interface, esp. the >> Compare method? >> I don't see such in that rep. >> The implemented TestObject.Compare method has different signature: it >> requests a TestObject, not a Comparable interface, as your spec! >> This is only the first error. >> >> The second is that a slice of objects cannot be converted to a slice of >> interface - only by manually copying: >> >> ``` >> diff --git a/sort_test.go b/sort_test.go >> index 0874721..c89b3b3 100644 >> --- a/sort_test.go >> +++ b/sort_test.go >> @@ -13,10 +13,10 @@ type TestObject string >> >> type TestList []TestObject >> >> -func (this TestObject) Compare(that TestObject) int { >> +func (this TestObject) Compare(that Comparable) int { >> >> var bi, bj byte >> - var x, y, z int = 0, len(this), len(that) >> + var x, y, z int = 0, len(this), len(that.(TestObject)) >> var d, c int = 0, 0 >> >> if y == z { >> @@ -34,7 +34,7 @@ func (this TestObject) Compare(that TestObject) int { >> >> for ; x < c; x++ { >> bi = this[x] >> - bj = that[x] >> + bj = (that.(TestObject))[x] >> if bi != bj { >> >> if bi < bj { >> @@ -58,7 +58,11 @@ func (this TestList) Print() { >> func TestSort(t *testing.T) { >> var vector TestList = TestList{TestObject("20231219192613"), >> TestObject("20231221074246"), TestObject("20240102214104"), >> TestObject("20231222063428"), TestObject("20240104112200"), >> TestObject("20231217190339"), TestObject("20231213155157"), >> TestObject("20231219065525"), TestObject("20231231120412"), >> TestObject("20231221152849"), TestObject("20240102073948"), >> TestObject("20240101083455")} >> >> - Sort(vector) >> + objs := make([]Comparable, len(vector)) >> + for i := range vector { >> + objs[i] = vector[i] >> + } >> + Sort(objs) >> >> vector.Print() >> } >> ``` >> John Pritchard a következőt írta (2024. január 6., szombat, 8:53:01 >> UTC+1): >> >>> Hi, >>> >>> Here's a case of "type dissonance" I don't understand. Why should it be? >>> >>> https://github.com/syntelos/go-sort >>> >>> >>> An interface type not passing through a static public package function >>> that employs the interface. >>> >>> type Comparable interface { >>> >>> >>> Compare(Comparable) int >>> >>> } >>> >>> func Sort(array []Comparable) ([]Comparable) >>> >>> >>> With go-1.20.12: >>> >>> $ go test >>> # github.com/syntelos/go-sort [github.com/syntelos/go-sort.test] >>> ./sort_test.go:61:7: cannot use vector (variable of type TestList) as >>> []Comparable value in argument to Sort >>> FAIL github.com/syntelos/go-sort [build failed] >>> >>> >>> Any comments? >>> >>> Best, >>> >>> John >>> >>> >>> -- >> 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...@googlegroups.com. >> To view this discussion on the web visit >> https://groups.google.com/d/msgid/golang-nuts/ba7239c1-cb52-4f86-9e56-da6ffa721fa5n%40googlegroups.com >> >> <https://groups.google.com/d/msgid/golang-nuts/ba7239c1-cb52-4f86-9e56-da6ffa721fa5n%40googlegroups.com?utm_medium=email&utm_source=footer> >> . >> > -- 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. To view this discussion on the web visit https://groups.google.com/d/msgid/golang-nuts/a44e7a3b-9390-460e-9b80-e9f5ffe5a18bn%40googlegroups.com.