以下代码生成错误:
./main.go:12:无法使用数据(类型 []map[string]interface {})作为要执行的参数中的类型行
package main
type (
Row map[string]interface{}
Rows []Row
)
func do(data Rows) {}
func main() {
var data []map[string]interface{}
do(data)
}
如果我尝试进行类型转换,例如do(Rows(data))
,go 说:
./main.go:12:无法将数据(类型 []map[string]interface {})转换为类型 Rows
但是,以下版本编译正常:
package main
type Rows []map[string]interface{}
func do(data Rows) {}
func main() {
var data []map[string]interface{}
do(data)
}
谁能解释一下为什么吗?在第一种情况下,有没有正确的方法来进行类型转换?
最佳答案
有关“原因”,请参阅 link posted by mkopriva 。以下答案是针对您的原始案例。
在第一种情况下,您可以单独转换每个 map[string]interface{}
(循环遍历它们),然后将 []Row
转换为 Rows
。你不能一次性施放全部东西。从 []Row 到 Rows 的转换可以隐式完成。
这是您的test snippet使用所描述的方法来转换它。
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)
}
关于golang 类型转换规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45432904/