2017-06-17 2 views
0

Ich versuche Typ Assertion und Konvertierung zu lernen. Es ist irgendwie kompliziert für mich.Benötigen Typ Assertion auf Funktionen

Ich habe dieses Beispiel: (Ich bin mit Gin Rahmen)

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

also im obigen Code .. Ich bin db Env Typen eingestellt werden und es zu Router-Funktionen übergeben. Von dort muss ich eine andere Funktion aufrufen. Wie geht das?

Wenn ich rufe e._GetUserId (E-Mail), sagt es

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

Wie dieses Problem zu lösen ?. Muss ich die Schnittstelle {} anstelle der Struktur für den Env-Typ verwenden?

+1

Does 'session.Get ("E-Mail")' 'kehrt Schnittstelle {}' Typ? Wenn ja, dann gib Assertion für den E-Mail-Parameter wie folgt ein: 'e._GetUserId (email. (String))'. – jeevatkm

+0

@jeevatkm Wenn das das Problem ist, würde nicht die Fehlermeldung "kann nicht konvertieren ... zu ** string ** **" eingeben? – smarx

+0

Ich glaube nicht, dass die Fehlermeldung mit diesem Code übereinstimmt ... nirgendwo, was ich sehen kann, wird etwas namens 'email' verwendet, wo ein 'Env' sein sollte. – smarx

Antwort

1

Drafting-Antwort basierend auf Konversation aus meinen Kommentaren.

Methode session.Get("email") gibt interface{} zurück.

Und Methode e._GetUserId() String-Parameter übernimmt, so dass Sie Typ Behauptung als string wie tun muss -

e._GetUserId(email.(string)) 
Verwandte Themen