On Wed, Apr 27, 2022 at 3:56 PM will....@gmail.com
<will.fau...@gmail.com> wrote:
>
> Do slices and maps have compatible type sets regarding the range operator?
>
> I was trying to iterate through either, where slice keys are the indexes, 
> such that this would work:
>
> type KV[K comparable, V any] interface {
>     ~[]V | map[K]V
> }
>
> func f[KV2 KV[K, V], K comparable, V any](kv KV2) {
>     for k, v := range kv { // line 12
>         fmt.Println(k, v)
>     }
> }
>
> func main() {
>     f[map[string]string, string, string](map[string]string{"a": "b", "c": 
> "d"}) // works
>     f[[]string, int, string]([]string{"e", "f"}) // error
> }
>
> I get this error:
>
> ./prog.go:12:20: cannot range over kv (variable of type KV2 constrained by 
> KV[K, V]) (KV2 has no core type)
>
> Play link: https://go.dev/play/p/jSfaEaTmcQ1
>
> I'm having trouble understanding this error message. Is this saying that maps 
> and slices don't have a core type because they're not compatible for the 
> range operator?

Currently a for/range statement using a value whose type is a type
parameter is only permitted if the type parameter constraint gives it
a core type.  Basically, a core type is an optional tilde followed by
a single type.  It is not a union.  See
https://go.dev/ref/spec#Core_types.

So the compiler is telling you that the type parameter KV2 has no core
type, so for/range is not permitted.

We impose this restriction to simplify the meaning of for/range, and
to avoid having to figure out what it would mean to range over a type
parameter whose constraint is []byte | map[int]string | chan float64.

It is possible that we will lift this restriction in a future release.

Ian

-- 
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/CAOyqgcW6frMx6Mv%3DCDC7AsxjtfaoetKM575W3yZKvxsf5DwEnw%40mail.gmail.com.

Reply via email to