¿Qué son los canales (channels) en Go?
En los ejemplos pasados utilizamos time.Sleep
para forzar a los programas a mantenerse esperando mientras la rutina se completaba. Esto basado en una estimación de tiempo, pero que no deja de ser solo eso, una estimación. La realidad es que necesitamos mejores formas de detectar cuando una rutina se ha completado, en caso de que de dicho proceso dependa otro, como puede ser terminar el programa.
Los canales permiten a los datos moverse dentro y fuera de las rutinas, así como facilitar la comunicación entre ellas. El slogan de la concurrencia en Golang es No comunicarse compartiendo la memoria, compartir la memoria al comunicarse. En otros lenguajes de programación, la memoria es compartida entre múltiples procesos o tareas para operar entre si y realizando bloqueos en dicho espacio de la memoria, de forma que solo un proceso pueda accesar a esta. Sin embargo el manejo de la memoria a través de esta metodología es complicado, y requiere que el programador tenga un conocimiento profundo de como hacerlo.
En un modelo de concurrencia, no se sabe que proceso será el primero en actualizará los datos, por lo que manejar la memoria se vuelve sumamente complejo. Por ello Golang utiliza canales con los cuales comparte mensajes entre las rutinas. Aunque las rutinas no son tareas, es decir que una no bloquea a la otra, se pueden utilizar canales para realizar dicha operación.