golang类型转换规则

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