猿问

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

我正在使用Go NSQ 库接收消息,其中一个字段是map[string]string's 的一部分。我觉得我应该能够输入 assert 这个字段,value.([]map[string]string)但是它失败了,我不知道这是否是预期的。

此代码段复制行为https://play.golang.org/p/qcZM880Nal

为什么这种类型的断言会失败?


慕的地10843
浏览 179回答 2
2回答

UYOU

这在 FAQ 中有简要介绍。类型[]interface{}和[]map[string]string在内存中有两种不同的表示。没有直接的方法可以在它们之间进行转换。此外,即使允许转换,您也应该注意,您根本无法成功断言为不同的基本类型(http://play.golang.org/p/zMp1qebIZZ)。您只能断言原始类型或其他类型的接口,// panicsvar i interface{} = int32(42)_ = i.(int64)

PIPIONE

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

相关分类

Go
我要回答