2017-06-17 23 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. 
} 

ので、上記のコードで..私は、DBのEnvタイプを設定することだし、ルータ機能に渡します。そこから、別の関数を呼び出す必要があります。どうやってするか?私はe._GetUserId(電子メール)を呼び出すと

、それがこの問題を解決するために

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

どのように言います?。 Env型に対してstructの代わりにinferface {}を使用する必要がありますか?

+1

い 'session.Get( "Eメール")'戻っ 'インタフェース{}'タイプ? yesの場合は、この 'e._GetUserId(電子メール。(文字列)) 'のような電子メールパラメータに「assertion」と入力します。 – jeevatkm

+0

@jeevatkmそれが問題であれば、エラーメッセージは "変換できません...タイプ**の文字列**"と言うでしょうか? – smarx

+0

私はエラーメッセージがこのコードと一致しないと思います...私が見ることができるところは、 'Env'があるはずの' email'と呼ばれるものです。 – smarx

答えて

1

私のコメントからの会話に基づく草案の回答。

方法session.Get("email")interface{}タイプを返します。

そして、あなたのようなstringようなタイプのアサーションを行う必要があるので、文字列パラメータを受け入れるe._GetUserId()方法 -

e._GetUserId(email.(string)) 
関連する問題