golang 类型转换规则

标签 go casting

以下代码生成错误:

./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/

相关文章:

PHP money 字符串转换为整数错误

c++ - 从 64 位转换为 32 位时,Gcc 不会给出任何警告

go - 有什么方法可以在 Cloud Firestore 的 (Go) 代码中创建索引豁免吗?

c - 如何计算 OS X 上 Go 程序中的系统调用?

arrays - Golang 最佳实践 : empty array response or error?

c++ - 基类指针赋值给派生类的底层机制是什么

C++ - 竞争性类型转换/作业

java - Java 中的转换(接口(interface)和类)

json - 尝试将 unix 格式的字符串转换为 time.Time 时,使用 json.Unmarshal 给出 ParseError

go - 在 Go 中要求 HTTP Basic Auth 的惯用方式?