2

The following code generated an error:

./main.go:12: cannot use data (type []map[string]interface {}) as type Rows in argument to do

package main

type (
    Row  map[string]interface{}
    Rows []Row
)

func do(data Rows) {}

func main() {
    var data []map[string]interface{}
    do(data)
}

If I try to do a type cast, e.g. do(Rows(data)), go said:

./main.go:12: cannot convert data (type []map[string]interface {}) to type Rows

However, the following version compiles OK:

package main

type Rows []map[string]interface{}

func do(data Rows) {}

func main() {
    var data []map[string]interface{}
    do(data)
}

Could anyone explain why? In the first case, is there any proper way to do the typecast?

xrfang
  • 1,754
  • 4
  • 18
  • 36
  • 2
    https://stackoverflow.com/questions/12753805/type-converting-slices-of-interfaces-in-go – mkopriva Aug 01 '17 at 08:51
  • Possible duplicate of [Type converting slices of interfaces in go](https://stackoverflow.com/questions/12753805/type-converting-slices-of-interfaces-in-go) – Jonathan Hall Aug 01 '17 at 20:04

1 Answers1

2

For "why" see the link posted by mkopriva. The following answer is regarding your original case.

In the first case you could cast each map[string]interface{} individually (looping over them) and then cast []Row to Rows. You cannot cast the whole thing at once. The cast from []Row to Rows can be done implicitly.

Here your test snippet with the described ways to cast it.

package main

type (
    Row  map[string]interface{}
    Rows []Row
)

func do(data Rows) {}

func main() {
    var (
        data []map[string]interface{}
        rws []Row
        rows Rows
    )
    for _, r := range data {
        rws = append(rws, Row(r))
        rows = append(rows, Row(r))
    }
    do(Rows(rws))  // possible but not necessary
    do(rws)        // this works just fine
    do(rows)
}
TehSphinX
  • 6,536
  • 1
  • 24
  • 34