需要对函数进行类型断言
Need type assertion on functions
我正在尝试学习类型断言和转换。这对我来说有点复杂。
我有这个例子:(我使用的是 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?
根据我的评论中的对话起草答案。
方法session.Get("email")
returnsinterface{}
类型。
并且方法 e._GetUserId()
接受字符串参数,因此您需要像 -
一样进行类型断言 string
e._GetUserId(email.(string))
我正在尝试学习类型断言和转换。这对我来说有点复杂。
我有这个例子:(我使用的是 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?
根据我的评论中的对话起草答案。
方法session.Get("email")
returnsinterface{}
类型。
并且方法 e._GetUserId()
接受字符串参数,因此您需要像 -
string
e._GetUserId(email.(string))