Я пытаюсь изучить утверждение типа и преобразование. Это как-то сложно для меня.
У меня есть этот пример: (я использую gin framework)
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
Как решить эту проблему?. Нужно ли использовать inferface{} вместо struct для типа Env?
session.Get("email")
возвращает типinterface{}
? Если да, введите утверждение для параметра электронной почты, напримерe._GetUserId(email.(string))
. - person jeevatkm   schedule 17.06.2017email
использовалось вместоEnv
. - person user94559   schedule 17.06.2017reflect.Typeof
принимает любой тип, поэтому параметрinterface{}
возвращает фактический тип значения. Я опубликую ответ, чтобы вы могли его принять. - person jeevatkm   schedule 17.06.2017