Reputation: 2333
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?
Upvotes: 2
Views: 499
Reputation: 7440
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)
}
Upvotes: 2