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.

Reply via email to