为了账号安全,请及时绑定邮箱和手机立即绑定

我应该能够输入断言一段字符串映射吗?

我应该能够输入断言一段字符串映射吗?

Go
慕的地10843 2021-11-08 14:43:10
我正在使用Go NSQ 库接收消息,其中一个字段是map[string]string's 的一部分。我觉得我应该能够输入 assert 这个字段,value.([]map[string]string)但是它失败了,我不知道这是否是预期的。此代码段复制行为https://play.golang.org/p/qcZM880Nal为什么这种类型的断言会失败?
查看完整描述

2 回答

?
UYOU

TA贡献1878条经验 获得超4个赞

这在 FAQ 中有简要介绍。


类型[]interface{}和[]map[string]string在内存中有两种不同的表示。没有直接的方法可以在它们之间进行转换。


此外,即使允许转换,您也应该注意,您根本无法成功断言为不同的基本类型(http://play.golang.org/p/zMp1qebIZZ)。您只能断言原始类型或其他类型的接口,


// panics

var i interface{} = int32(42)

_ = i.(int64)


查看完整回答
反对 回复 2021-11-08
?
PIPIONE

TA贡献1829条经验 获得超9个赞

所指的转换不像吉姆的回答中所描述的那样工作。但是,如果您确实拥有您声明的类型,并且您声明它实现的接口就是interface{}那么类型断言就可以正常工作。我不想推测为什么另一个不起作用的细节,但我相信这是因为您必须分两个阶段将其拆箱,因为map[string]string切片内的 's 实际上被视为某些interface{}本身。这是一个例子;


package main


import "fmt"


func main() {

    var value interface{}


    value = []map[string]string{{"address": string("this is interface literal")}}

    // value = []map[string]string{{"address": "this is map literal"}}


    AssertIt(value)



}


func AssertIt(value interface{}) {

    if str, ok := value.([]map[string]string); ok && len(str) > 0 {

        fmt.Println(str[0]["address"])

    } else {

        fmt.Println("nope")

    }

}

https://play.golang.org/p/hJfoh_havC



查看完整回答
反对 回复 2021-11-08
  • 2 回答
  • 0 关注
  • 178 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信