【问题标题】:Gorilla session extracting structure value from session golang大猩猩会话从会话golang中提取结构值
【发布时间】:2016-08-01 03:58:17
【问题描述】:

我在我的 gorilla 会话中创建了一个用户条目

session.Values["ub"] = ub

但是,当我提取时,提取的接口正在获取值,但是当我将数据类型断言到我的用户结构中时,它显示为 null。

我不明白这背后的原因,因为当我使用其他结构运行相同的代码时,它工作正常。可能是什么原因以及如何解决这个问题。

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:}

【问题讨论】:

  • 试试这个:ub, ok = val.(UserBasic) 而不是 ub, ok = val.(*UserBasic)
  • 我通过在各处删除指针来修复它。你提出了同样的建议。但是我不明白为什么当“val”具有价值时“ub”没有得到价值。类型断言有什么例外吗?

标签: google-app-engine session go


【解决方案1】:

如果你的接口方法有指针接收器,你应该把它创建为一个指针,像这样:

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.")
}

你可以在编译时检查一个类型是否实现了一个接口:

验证*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)

【讨论】:

    猜你喜欢
    • 2014-03-15
    • 2014-11-24
    • 1970-01-01
    • 2015-03-30
    • 1970-01-01
    • 2019-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多