package with import ( "context" "database/sql" "log" "time" _ "github.com/lib/pq" ) func PSQL(ctx context.Context, conn string, foo func(db *sql.DB) error) error { log.Println("opening...") pg, err := sql.Open("postgres", conn) if err != nil { return err } defer func() { log.Println("closed:", pg.Close()) }() func() { pinged := make(chan bool) defer close(pinged) for { log.Println("pinging...") go func() { err := pg.PingContext(ctx) if err != nil { log.Println("!", err) } select { case pinged <- err == nil: case <-ctx.Done(): case <-time.After(time.Second * 5): } }() select { case <-ctx.Done(): return case ok := <-pinged: if ok { return } case <-time.After(time.Second * 5): } } }() return foo(pg) }