为什么推迟stmnt.Close()似乎阻止了我的http.Redirect?

Why does my defer stmnt.Close() seem to block my http.Redirect from redirecting it just hangs on the website infinitely trying to load.

But if I remove the defer stmnt.Close() it redirects just fine?

    err = db.QueryRow("SELECT steamid FROM accounts WHERE steamid = ?", ids).Scan(&steamid)
    if err != nil {
        common.WriteLog(err.Error(), r)
        http.Error(w, "Failed to connect to database. Try again in a bit.", 500)
    }

    switch {
    case len(profile.Response.Players) == 0:
        common.WriteLog("Failed to look you up in the steam database. Try again in a bit.", r)
        http.Error(w, "Failed to look you up in the steam database. Try again in a bit.", 500)
    case err == sql.ErrNoRows:
        stmnt, err := db.Query("INSERT INTO accounts SET steamid=?", ids)
        if err != nil {
            common.WriteLog(err.Error(), r)
            http.Error(w, "Failed to insert your account to the database. Try again in a bit.", 500)
        }
        defer stmnt.Close() // <<<<< The suspect
        // Insert Account

        http.Redirect(w, r, "/", 303)
    case err != nil:
        common.WriteLog(err.Error(), r)
        http.Error(w, "Failed to insert your account to the database. Try again in a bit.", 500)

    default:
        // Login User

        http.Redirect(w, r, "/", 303)

    }

Use db.Exec instead of db.Query.

Exec executes a query without returning any rows.

vs

Query executes a query that returns rows

As for why, I would guess the mysql Rows.Close is waiting for data on the connection:

func (rows *mysqlRows) Close() error {
    mc := rows.mc
    if mc == nil {
        return nil
    }
    if mc.netConn == nil {
        return ErrInvalidConn
    }

    // Remove unread packets from stream
    err := mc.readUntilEOF()
    rows.mc = nil
    return err
}

Which is never going to happen.

See this for example.