database/sql: use method values instead of generating closures

Reduces garbage.

R=adg, r
CC=dsymonds, gobot, golang-dev
https://golang.org/cl/9088045
diff --git a/src/pkg/database/sql/sql.go b/src/pkg/database/sql/sql.go
index a80782b..968cb74 100644
--- a/src/pkg/database/sql/sql.go
+++ b/src/pkg/database/sql/sql.go
@@ -219,6 +219,10 @@
 	dbmuClosed bool     // same as closed, but guarded by db.mu, for connIfFree
 }
 
+func (dc *driverConn) releaseConn(err error) {
+	dc.db.putConn(dc, err)
+}
+
 func (dc *driverConn) removeOpenStmt(si driver.Stmt) {
 	dc.Lock()
 	defer dc.Unlock()
@@ -367,10 +371,7 @@
 	if !done {
 		return func() error { return nil }
 	}
-	return func() error {
-		//println(fmt.Sprintf("calling final close on %T %v (%#v)", x, x, x))
-		return x.finalClose()
-	}
+	return x.finalClose
 }
 
 // Open opens a database specified by its database driver name and a
@@ -710,9 +711,7 @@
 		return nil, err
 	}
 
-	releaseConn := func(err error) { db.putConn(ci, err) }
-
-	return db.queryConn(ci, releaseConn, query, args)
+	return db.queryConn(ci, ci.releaseConn, query, args)
 }
 
 // queryConn executes a query on the given connection.
@@ -1154,8 +1153,7 @@
 	}
 
 	conn := cs.dc
-	releaseConn = func(err error) { s.db.putConn(conn, err) }
-	return conn, releaseConn, cs.si, nil
+	return conn, conn.releaseConn, cs.si, nil
 }
 
 // Query executes a prepared query statement with the given arguments