在函数

时间:2017-06-17 03:50:40

标签: go go-gin

我正在尝试学习类型断言和转换。这对我来说有点复杂。

我有这个例子:(我正在使用gin框架)

type Env struct {
    db *sql.DB
}

func main() {
    r := gin.Default()

    // Initiate session management (cookie-based)
    store := sessions.NewCookieStore([]byte("secret"))
    r.Use(sessions.Sessions("mysession", store))

    db, _ := sql.Open("sqlite3", "./libreread.db")
    defer db.Close()

    env := &Env{db: db}
    r.GET("/", env.GetHomePage)
}

func (e *Env) _GetUserId(email string) int64 {
    rows, err := e.db.Query("SELECT `id` FROM `user` WHERE `email` = ?", email)
    CheckError(err)

    var userId int64
    if rows.Next() {
        err := rows.Scan(&userId)
        CheckError(err)
    }
    rows.Close()

    return userId
}

func (e *Env) GetHomePage(c *gin.Context) {

    session := sessions.Default(c)
    email := session.Get("email")

    if email != nil {
        name := c.Param("bookname")
        userId := e._GetUserId(email) // I'm stuck here.
}

所以,在上面的代码中..我正在设置db Env类型并将其传递给路由器功能。从那里,我需要调用另一个函数。怎么做?

当我打电话给e._GetUserId(电子邮件)时,它说

cannot convert email (type interface {}) to type Env: need type assertion

如何解决这个问题?对于Env类型,我是否需要使用inferface {}而不是struct?

1 个答案:

答案 0 :(得分:2)

根据我的评论中的对话起草答案。

方法session.Get("email")返回interface{}类型。

方法e._GetUserId()接受字符串参数,因此您需要将类型断言设为string,如 -

e._GetUserId(email.(string))