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.

Reply via email to