【问题标题】:Need type assertion on functions需要对函数进行类型断言
【发布时间】:2017-06-17 12:13:27
【问题描述】:

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

我有这个例子:(我正在使用 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(email) 时,它说

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

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

【问题讨论】:

  • session.Get("email") 是否返回 interface{} 类型?如果是,则为电子邮件参数键入断言,如e._GetUserId(email.(string))
  • @jeevatkm 如果这是问题所在,错误消息不会说“无法将 ... 转换为类型 string”吗?
  • 我认为错误消息与此代码不匹配...我看不到任何名为 email 的东西用于 Env 的位置。
  • @jeevatkm 哇,好用!但是当我用 reflect.Typeof(session.Get("email")) 检查它时。它说字符串值。为什么在函数参数中使用 interface{}?
  • @rnk 不客气。 reflect.Typeof 方法接受任何类型,这就是为什么参数是 interface{} 返回值的实际类型。我会发布一个答案,以便您接受。

标签: go go-gin


【解决方案1】:

根据我的 cmets 的对话起草答案。

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

并且方法e._GetUserId()接受字符串参数,所以你需要像string那样做类型断言-

e._GetUserId(email.(string))

【讨论】:

    猜你喜欢
    • 2021-12-04
    • 2021-04-23
    • 2016-06-30
    • 2022-11-21
    • 2021-06-15
    • 1970-01-01
    • 1970-01-01
    • 2012-12-26
    • 1970-01-01
    相关资源
    最近更新 更多