落在引用/指针上的类型断言
Type assertion falling on reference / pointer
我正在尝试从参考中获取地图,但断言似乎失败了:
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)
类型断言要求您要断言的类型与断言部分的类型完全相同。
根据您的代码,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
}
}
您将 *
放在了错误的位置。应该是flash.(*gin.H)
。
我正在尝试从参考中获取地图,但断言似乎失败了:
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)
类型断言要求您要断言的类型与断言部分的类型完全相同。
根据您的代码,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
}
}
您将 *
放在了错误的位置。应该是flash.(*gin.H)
。