我试图从引用中获取一个映射,并且断言似乎失败了:
session.AddFlash(gin.H{
"username": username,
"password": password,
}, "_post")
...
flashes := session.Flashes("_post")
if flashes != nil {
flash = flashes[0]
fmt.Printf("%T\n", flash)
if post_data, ok := flash.(gin.H); ok {
fmt.Println("post_data:", post_data)
data = post_data
} else {
fmt.Println("post_data(failed):", post_data)
}
}
但是我总是得到以下输出,断言失败:
*gin.H
post_data(failed): map[]
我认为它是由于我正在做的断言,所以我尝试过:
if post_data, ok := (*flash).(gin.H); ok {
然后我得到invalid indirect of flash (type interface {})
我也尝试过:
if post_data, ok := *flash.(gin.H); ok {
但这给了我invalid indirect of flash.(gin.H) (type gin.H)
答案 0 :(得分:2)
您将*
放在错误的位置。它应该是flash.(*gin.H)
。
答案 1 :(得分:0)
类型断言要求您声明的类型与断言部分的类型完全相同。
从您的代码中,flash
是interface{}
类型,基础类型是*gin.H
(由fmt.Printf("%T", flash)
打印)。因此断言应为flash.(*gin.H)
以下是一些关于使用类型断言的示例:
package main
import r "reflect"
type A struct {
Name string
}
func main() {
// No pointer
aa := A{"name"}
var ii interface{} = aa
bb := ii.(A)
// main.A
// Pointer
a := &A{"name"}
var i interface{} = a
b := *i.(*A)
// main.A
c := i.(*A)
// *main.A
d := r.Indirect(r.ValueOf(i)).Interface().(A)
// main.A
}
}