我有一个功能:

func ReturnTuples(map_ map[interface{}]interface{}) [][]interface{} {

我试着这样打电话:

m := make(map[string]int)
m["k1"] = 7
m["k2"] = 13
fmt.Println(ReturnTuples(m))

但是我得到了

cannot use m (type map[string]int) as type map[interface {}]interface {} in argument to ReturnTuples

既然stringint都实现了interface{},它难道不应该工作吗?

我已经搜索过了,我最多只能找到Convert map[interface {}]interface {} to map[string]string,但是它不能回答为什么我不能用m作为参数.

我还相信,如果函数的参数只有interface{},它也会工作,因为map[something][something]实现了interface,对吗?什么是最好的方法,为什么在我的情况下不起作用?

推荐答案

要解决您的问题,只需将映射作为空接口的空接口启动:

m := map[interface{}]interface{}

然后,您可以在"ReturnTuples"函数中分配所需的任何类型键或值.

playground example

注意:请记住,如果以后要将这些值用作原始类型,则需要使用类型断言,因为现在它们的类型为interface{}

您可以这样做,Where anything是一个映射值,您可以使用for循环获得该映射值:

switch v := anything.(type) {
      case string:
            fmt.Println(v)
      case int32, int64:
            fmt.Println(v)
      case string:
            fmt.Println(v)
      case SomeCustomType:
            fmt.Println(v)
      default:
            fmt.Println("unknown")
}

如果你在寻找"为什么"的解释 @ymonad个人已经给出了完整的答案,所以我不会再重复了.

希望这是有意义的

PS:不要在这个问题上投反对票,在我看来这是合法的...

Go相关问答推荐

Google OAuth2没有刷新令牌

Kafka消费者在需要时不会暂停

Go GORM创建表,但不创建列

GORM Find(&;Room)操作使用空数据而不是实际数据填充 struct

显示GUI时后台处理功能

如何从 nil 指针创建值

Kafka golang 生产者在错误后更改分区计数

切片的下限和上限

使用goroutines在Golang中验证 struct

这是实现超时的常见方法,为什么 time.After 不起作用

GoLang: gocui 边框 colored颜色

如何使用带有方法的字符串枚举作为通用参数?

无法使用 Golang 扫描文件路径

查找、解析和验证邮箱地址

致命错误:找不到由 zergon321/reisen 引起的libavcodec/avcodec.h文件

Go 中 SDL Surface 的 OpenGL 纹理

具有相同提前返回语句的函数的不同基准测试结果

如何在gorm中处理多个查询

Go模板中的浮点除法

如何发送带有登录数据的 GET 请求并将 cookie 数据保存到 txt 文件?