google-app-engine - Gorilla session 从 session golang 中提取结构值

标签 google-app-engine session go

我在我的 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/

相关文章:

python - Google App Engine 静态文件 GET 404

google-app-engine - 每个服务/模块的 Cron (AppEngine)

python - 来自 google appengine 使用 python 的出站 FTP 请求

php - 从 $_SESSION 获取数据

asp.net-mvc-3 - 使用隐藏字段来持久化数据的困惑

http - RFC 2616 HTTP 内容长度和传输编码兼容性

string - 你如何让一个函数检测一个字符串是否是二进制安全的

google-app-engine - 如何在 objectify 中通过嵌套 Refs 进行查询

Golang https 服务器以字节数组形式传递 certFile 和 kyeFile

php - 如何检查 PHP session 是否为空?