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?
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)
}