2017-06-17 60 views
0

我想學習類型斷言和轉換。對我來說有點複雜。需要類型斷言的功能

我有這樣的例子:(我使用杜松子酒框架)

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. 
} 

所以,在上面的代碼..我設置分貝的Env類型並將它傳遞給路由器功能。從那裏,我需要調用另一個函數。怎麼做?

當我打電話e._GetUserId(電子郵件),它說

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

如何解決這個問題?我需要使用inferface {}來代替Env類型的結構嗎?

+1

是否'session.Get( 「電子郵件」)''返回接口{}'型?如果是,那麼輸入斷言作爲電子郵件參數,例如'e._GetUserId(email。(string))'。 – jeevatkm

+0

@jeevatkm如果這是問題,不會錯誤消息說「不能轉換...鍵入**字符串**」? – smarx

+0

我不認爲錯誤信息與此代碼相匹配......我無法看到的地方是'Env'應該使用的所謂'email'。 – smarx

回答

1

根據我評論的談話起草答案。

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

而且e._GetUserId()接受字符串參數,所以你需要做的類型斷言爲string樣方法 -

e._GetUserId(email.(string))