我不确定为什么以下投射不起作用:
import "fmt"
func main() {
v := map[string]interface{}{"hello": "world"}
checkCast(v)
}
func checkCast(v interface{}) {
_, isCorrectType := v.(map[string]string)
if !isCorrectType {
fmt.Printf("incorrect type") <------------- why does it enter this if statement?
return
}
}
答案 0 :(得分:6)
map[string]interface{}
与map[string]string
不同。类型interface{}
与类型string
不同。
如果他们都是map[string]string
:
package main
import "fmt"
func main() {
v := map[string]string{"hello": "world"}
checkCast(v)
}
func checkCast(v interface{}) {
_, isCorrectType := v.(map[string]string)
if !isCorrectType {
fmt.Printf("incorrect type")
return
}
}
输出:
[no output]
语句v.(map[string]string)
是一个类型断言,而不是强制转换。
The Go Programming Language Specification
对于接口类型的表达式
x
和类型T
,主要表达式 表达x.(T)
断言
x
不是nil
,并且x
中存储的值是 输入T
。符号x.(T)
称为类型断言。
Go有转换。
The Go Programming Language Specification
转化是
T(x)
形式的表达式,其中T
是一种类型x
是一个可以转换为T
类型的表达式。