some interesting ideas: reuse package keyword to declare generics

250 views
Skip to first unread message

Di gg

unread,
Aug 26, 2020, 1:16:49 PM8/26/20
to golang-nuts


This is an alternative generic idea set, which should be Go 1 compatible.
It tries to use the same syntax forms as builtin generics.

Different from the official draft, it adopts a from-top-to-bottom pattern,
instead of the from-bottom-to-top pattern, to describe type parameters.
For example, given a map type parameter M, its key and element types could
be denoted as M.key and M.element, whereas to use a map type parameter,
its key and elements must also present in the declaration signarure or constraint definitions.

Di gg

unread,
Aug 26, 2020, 11:26:12 PM8/26/20
to golang-nuts
> whereas to use a map type parameter,
its key and elements must also present in the declaration signarure or constraint definitions.

sorry, missed some words here. It should be

whereas for the official draft, ...

Di gg

unread,
Sep 11, 2020, 11:00:12 PM9/11/20
to golang-nuts
An example demostrating how to let Reader.Read support both string and []byte parameters.

package readonlybytes[T] (
    assert T.kind & (String | Slice)
)

package Reader[T] (
    assert readonlybytes[T]
){
    type Reader interface {
        Read(bytes T)(n int, err error)
    }
}

package MyReader[T](
    assert T.kind & (String | Slice)
){
    type MyReader struct{}

    type (r *MyReader) Read(s T)(int, error) {
        return len(s), nil
    }
}

// use it:

var mrs MyReader string
var mrb MyReader []byte

s := "Golang"
bs := make([]byte, 100)

var rs Reader string = mrs
_, _ = rs.Read(s)
var rb Reader []byte = mrb
_, _ = rb.Read(bs)

rb = (MyReader string)(rs)
_, _ = rb.Read(bs)
rs = (MyReader []byte)(rb)
_, _ = rs.Read(s)



On Wednesday, August 26, 2020 at 1:16:49 PM UTC-4 Di gg wrote:

Di gg

unread,
Sep 11, 2020, 11:02:49 PM9/11/20
to golang-nuts
Sorry, the last 4 lines should be:

rs = (MyReader string)(rb)
_, _ = rs.Read(s)
rb = (MyReader []byte)(rs)
_, _ = rb.Read(bs)

Di gg

unread,
Sep 11, 2020, 11:04:32 PM9/11/20
to golang-nuts
Still a mistake there. All "MyReader" uses should be "*MyReader".
Reply all
Reply to author
Forward
0 new messages