2 回答
TA贡献1878条经验 获得超4个赞
这在 FAQ 中有简要介绍。
类型[]interface{}和[]map[string]string在内存中有两种不同的表示。没有直接的方法可以在它们之间进行转换。
此外,即使允许转换,您也应该注意,您根本无法成功断言为不同的基本类型(http://play.golang.org/p/zMp1qebIZZ)。您只能断言原始类型或其他类型的接口,
// panics
var i interface{} = int32(42)
_ = i.(int64)
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
- 2 回答
- 0 关注
- 178 浏览
添加回答
举报