我在我的 gorilla session 中创建了一个用户条目
session.Values["ub"] = ub
然而,当我提取时,提取的接口(interface)正在获取值,但是当我将数据类型断言到我的用户结构时,它显示为空。
我不明白这背后的原因,因为当我用其他结构运行相同的代码时,它工作正常。可能是什么原因以及如何解决这个问题。
val := session.Values["ub"]
var ub = &UserBasic{}
var ok bool
if val != "" {
//type assertion
//var userBasic = &auth.UserBasic{}
ub, ok = val.(*UserBasic)
if !ok {
// Handle the case that it's not an expected type
log.Infof(ctx, "GetUserGSession: UserBasic structure value %+v", ub)
log.Infof(ctx, "GetUserGSession: Value got from session %+v", val)
log.Infof(ctx, "GetUserGSession: reasserting %+v", val.(UserBasic))
}
return ub
} else {
ub := new(UserBasic)
return ub
}
*********结果************
2016/08/01 03:49:12 INFO: GetUserGSession: UserBasic structure value <nil>
2016/08/01 03:49:12 INFO: GetUserGSession: Value got from session {UserID:589578337 UserName:ds Name:ds createdAt:{sec:0 nsec:0 loc:<nil>} defaultProfileImage:false description: FavouritesCount:5 FollowersCount:0 FriendsCount:0 TotalTweets:6 ListedCount:0 Location: ProfileBgColor: ProfileBgImgURL: ProfileImgURL: IsLoggedIn:true TimeZone:}
2016/08/01 03:49:12 INFO: GetUserGSession: reasserting {UserID:589578337 UserName:ds Name:ds createdAt:{sec:0 nsec:0 loc:<nil>} defaultProfileImage:false description: FavouritesCount:5 FollowersCount:0 FriendsCount:0 TotalTweets:6 ListedCount:0 Location: ProfileBgColor: ProfileBgImgURL: ProfileImgURL: IsLoggedIn:true TimeZone:}
最佳答案
如果您的接口(interface)方法有指针接收者,您应该将其创建为指针,如下所示:
var val Worker = &UserBasic{100}
如果您使用 var val Worker = UserBasic{100}
,您将看到此错误:
UserBasic does not implement Worker (Work method has pointer receiver)
在此工作示例代码中:
package main
import "fmt"
var _ Worker = (*UserBasic)(nil) // Verify that *UserBasic implements Worker.
func main() {
var val Worker = &UserBasic{100}
ub, ok := val.(*UserBasic)
fmt.Println(ub, ok) // &{100} true
}
type Worker interface {
Work()
}
type UserBasic struct {
A int
}
func (t *UserBasic) Work() {
fmt.Println("Work.")
}
你可以在编译时检查一个类型是否实现了一个接口(interface):
验证 *UserBasic
实现了 Worker(编译:成功):
package main
import "fmt"
var _ Worker = (*UserBasic)(nil) // Verify that *UserBasic implements Worker.
func main() {
fmt.Println("Hello World!")
}
type Worker interface {
Work()
}
type UserBasic struct{}
func (t *UserBasic) Work() {
fmt.Println("Work.")
}
验证 UserBasic
实现了 Worker(编译:成功):
package main
import "fmt"
var _ Worker = UserBasic{} // Verify that UserBasic implements Worker.
func main() {
fmt.Println("Hello World!")
}
type Worker interface {
Work()
}
type UserBasic struct{}
func (t UserBasic) Work() {
fmt.Println("Work.")
}
为测试样本编译这段代码(编译:错误):
package main
import "fmt"
var _ Worker = (*UserBasic)(nil) // Verify that *UserBasic implements Worker.
func main() {
fmt.Println("Hello World!")
}
type Worker interface {
Work()
}
type UserBasic struct{}
它说:
.\m.go:5: cannot use (*UserBasic)(nil) (type *UserBasic) as type Worker in assignment:
*UserBasic does not implement Worker (missing Work method)
关于google-app-engine - Gorilla session 从 session golang 中提取结构值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38690815/