Требуется утверждение типа для функций

Я пытаюсь изучить утверждение типа и преобразование. Это как-то сложно для меня.

У меня есть этот пример: (я использую 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?


person rnk    schedule 17.06.2017    source источник
comment
session.Get("email") возвращает тип interface{}? Если да, введите утверждение для параметра электронной почты, например e._GetUserId(email.(string)).   -  person jeevatkm    schedule 17.06.2017
comment
@jeevatkm Если это проблема, разве в сообщении об ошибке не будет сказано, что невозможно преобразовать ... в тип string?   -  person user94559    schedule 17.06.2017
comment
Я не думаю, что сообщение об ошибке совпадает с этим кодом... я нигде не вижу, чтобы что-то под названием email использовалось вместо Env.   -  person user94559    schedule 17.06.2017
comment
@jeevatkm Вау, это работает! Но когда я проверяю это с помощью Reflect.Typeof(session.Get(email)). Он говорит строковое значение. Почему в качестве аргумента функции используется interface{}?   -  person rnk    schedule 17.06.2017
comment
@rnk Не за что. Метод reflect.Typeof принимает любой тип, поэтому параметр interface{} возвращает фактический тип значения. Я опубликую ответ, чтобы вы могли его принять.   -  person jeevatkm    schedule 17.06.2017
comment
@smarx вы правы, ошибка не соответствует коду. Я просмотрел предоставленный код и сделал предположение, основанное на коде, и попросил разъяснения.   -  person jeevatkm    schedule 17.06.2017


Ответы (1)


Составление ответа на основе разговора из моих комментариев.

Метод session.Get("email") возвращает тип interface{}.

И метод e._GetUserId() принимает строковый параметр, поэтому вам нужно сделать утверждение типа как string например -

e._GetUserId(email.(string))
person jeevatkm    schedule 17.06.2017