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/CAEkBMfFYUTzWz9mrD54_R5gJNPv0nKc1rPfeDZ1Kp_rxrMknpQ%40mail.gmail.com.
