xrfang
xrfang

Reputation: 2333

golang type cast rule

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

Answers (1)

TehSphinX
TehSphinX

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

Related Questions