hi there,

I am playing a bit with generics.
I am trying to implement a parametrized "Read" function that unmarshals
bytes into some type value that implements an interface:

type T1 struct {
        v string
}

func (t *T1) UnmarshalBinary(p []byte) error {
        t.v = string(p)
        return nil
}

type Unmarshaler interface {
        UnmarshalBinary(p []byte) error
}

func f1[T Unmarshaler](p []byte) (T, error) {
        var t T
        err := t.UnmarshalBinary(p)
        return t, err
}

func main() {
        p := []byte("hello")
        t1, err := f1[T1](p)
        if err != nil {
                log.Panic(err)
        }

        log.Printf("t1: %+v", t1)
}

my naive attempt failed like so:

./prog.go:26:16: T1 does not implement Unmarshaler (UnmarshalBinary method has 
pointer receiver)

it's only when I rewrite my f1 function like so that it "works":

func f2[T any](p []byte) (t T, err error) {
        switch t := any(&t).(type) {
        case Unmarshaler:
                err = t.UnmarshalBinary(p)
        default:
                panic("boo")
        }
        return t, err
}

but it doesn't take advantage of the nice type constraints Go's generics
provide.

of course, replacing:
 t1, err := f1[T1](p)

with:
 t1, err := f1[*T1](p)
compiles. but fails at runtime.

what am I missing?
how do I convey the constraint "unmarshaling usually imply passing a
pointer to some value" ?

-s

-- 
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/CJ9U1G7RBSM9.I0L5BA20IVD1%40clrinfopc42.

Reply via email to