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?
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
@jeevatkm Wenn das das Problem ist, würde nicht die Fehlermeldung "kann nicht konvertieren ... zu ** string ** **" eingeben? – smarx
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