我试图从引用中获取地图,但断言似乎失败了:
session.AddFlash(gin.H{
"username": username,
"password": password,
}, "_post")
。
flashes := session.Flashes("_post")
if flashes != nil {
flash = flashes[0]
fmt.Printf("%Tn", 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)
你把*
放在了错误的地方。应该是flash.(*gin.H)
.
类型断言要求要断言的类型与断言部分的类型完全相同。
从代码中,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
}
}