Thank you Axel immensely for your explanation and working example. I really benefited from them a lot. With this, I can now do polymorphism <https://go.dev/play/p/wQWjzmC4nWc> on the generic type. I have to say I am pretty impressed by the power and versatility of Go's generics type system.
On Sunday, December 28, 2025 at 6:40:36 PM UTC+8 Axel Wagner wrote: > On Sun, 28 Dec 2025 at 09:02, [email protected] <[email protected]> wrote: > >> Hi fellow Gophers >> >> Unfortunately, I have another generics question that is truly driving me >> nuts. >> Why does the below snippet not compile: >> >> https://go.dev/play/p/rf-EtF7hMdw >> > > As of now, the language does not imply that T==A, even if the type set of > T only has one type in it. You can work around that by converting to an > interface and using a type-assertion: > https://go.dev/play/p/Jboo1HZim5h > > It's a bit unfortunate, but them's the breaks right now. > > >> >> with the error message: >> >> ``` >> ./prog.go:27:9: cannot use &ASet{} (value of type *ASet) as Set[T] value >> in return statement: *ASet does not implement Set[T] (wrong type for method >> NewElement) have NewElement() A want NewElement() T >> ``` >> >> I'd assume `*ASet` obviously satisfy the `Set` interface. >> >> Many thanks in advance. >> >> p.s. Robert, the Field1, Field2, ... are just different failed approaches >> I tried. Luckily, Axel showed me the solution. I thought everything went >> well until I hit this problem... >> >> ``` >> package main >> >> import "fmt" >> >> type A struct{ F int } >> type ASet struct{} >> >> func (s *ASet) NewElement() A { >> return A{F: 5} >> } >> >> type B struct{ F float64 } >> type BSet struct{} >> >> func (s *BSet) NewElement() B { >> return B{F: 3.14} >> } >> >> type Set[T A | B] interface { >> NewElement() T >> } >> >> // This function definition does not work. Why?! >> func NewSet[T A]() Set[T] { >> return &ASet{} >> } >> >> func main() { >> s := NewSet[A]() >> fmt.Println(s) >> } >> ``` >> >> On Sunday, December 28, 2025 at 12:49:45 AM UTC+8 Robert Engels wrote: >> >>> >>> Field1 and Field2 are unused in your example. What is the purpose? >>> >>> On Dec 25, 2025, at 3:59 AM, 'Axel Wagner' via golang-nuts < >>> [email protected]> wrote: >>> >>> >>> https://go.dev/play/p/KV75rDOwIn2 >>> >>> On Thu, 25 Dec 2025 at 10:03, [email protected] <[email protected]> >>> wrote: >>> >>>> Hi fellow Gophers >>>> >>>> I am trying to define an interface that satisfies addition (ultimate >>>> goal is to define a field >>>> <https://en.wikipedia.org/wiki/Field_(mathematics)>). >>>> However, I could get the following code to compile: >>>> >>>> https://go.dev/play/p/zIwo1KW_Un0 >>>> >>>> no matter what approach I use (types Field0, Field1, Field2). >>>> The compiler error is of the pattern: >>>> >>>> ``` >>>> ./prog.go:29:22: *big.Rat does not satisfy Field0[any] (wrong type for >>>> method Add) have Add(*big.Rat, *big.Rat) *big.Rat want Add(any, any) any >>>> ``` >>>> >>>> I took the first approach from this recent post >>>> <https://go.dev/blog/generic-interfaces> on generics. >>>> If anyone could point to a correct way to make these kinds of >>>> self-referencing definitions would be much appreciated. >>>> >>>> Thanks >>>> >>>> ``` >>>> package main >>>> >>>> import ( >>>> "fmt" >>>> "math/big" >>>> ) >>>> >>>> type Field0[T any] interface { >>>> Add(T, T) T >>>> } >>>> >>>> type Field1[T any] interface { >>>> Add(Field1[T], Field1[T]) Field1[T] >>>> } >>>> >>>> type Field2 interface { >>>> Add(Field2, Field2) Field2 >>>> } >>>> >>>> type PolynomialTerm[K Field0[any]] struct { >>>> Coefficient K >>>> Monomial []byte >>>> } >>>> >>>> func main() { >>>> c := big.NewRat(0, 1) >>>> >>>> // This line doesn't compile no matter what Field we choose in >>>> PolynomialTerm's definition. >>>> t := PolynomialTerm[*big.Rat]{Coefficient: c} >>>> >>>> fmt.Println(t) >>>> } >>>> ``` >>>> >>>> -- >>>> 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 visit >>>> https://groups.google.com/d/msgid/golang-nuts/905e4f95-737f-48cb-bf9b-66e94e31e521n%40googlegroups.com >>>> >>>> <https://groups.google.com/d/msgid/golang-nuts/905e4f95-737f-48cb-bf9b-66e94e31e521n%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 [email protected]. >>> >>> To view this discussion visit >>> https://groups.google.com/d/msgid/golang-nuts/CAEkBMfFiayZh_3RcbU0iCTsJ3AFNGeykV4MqRKKm%2B%3D2%2BbymBPw%40mail.gmail.com >>> >>> <https://groups.google.com/d/msgid/golang-nuts/CAEkBMfFiayZh_3RcbU0iCTsJ3AFNGeykV4MqRKKm%2B%3D2%2BbymBPw%40mail.gmail.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 [email protected]. >> > To view this discussion visit >> https://groups.google.com/d/msgid/golang-nuts/fdc7366e-30ae-470a-866f-b856492090b6n%40googlegroups.com >> >> <https://groups.google.com/d/msgid/golang-nuts/fdc7366e-30ae-470a-866f-b856492090b6n%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 [email protected]. To view this discussion visit https://groups.google.com/d/msgid/golang-nuts/661630d6-8b0f-4fd4-8044-c7bc9f80da7dn%40googlegroups.com.
