Durante el pasado año y como parte de nuestra filosofía de mejora continua, hemos estado realizando diversas sesiones de formación compartida, en las que son los propios miembros de nuestro equipo los que ponen en común sus conocimientos, experiencias e ideas. Como sabemos, la capacitación constante y el aprendizaje continuo son fundamentales para mantenernos actualizados en un mundo tecnológico en constante evolución.
En esta serie de posts, comentaremos algunos aspectos clave de estas sesiones.
Píldora formativa 01:
Rutinas y canales en GO
Imparte:
Alex Coll
Go es un lenguaje:
• Tipado: intX y uintX¹, float32/64, byte y rune (alias de uint8 e int32, usados para representar char), boolean, string y complex (similar a float, pero para números complejos).
• Paso de parámetros por valor
• Punteros
• Garbage collector → mark-and-sweep: se marcan los objetos a los que puede referenciar el usuario. Después de esto, se limpiar la heap de objetos no marcados (inalcanzables)
Goroutines
Podemos entender las goroutines como hilos de ejecución². Imaginemos el caso del siguiente programa:
func f(start, end int) {
for i := start; i < end; i++ {
fmt.Println(i) }
}
func main() {
go f(4, 7)
go f(7, 11)
f(1, 4) time.Sleep(time.Second) fmt.Println(«done»)
}
Channels
Los canales son el mecanismo de comunicación entre goroutines. Para el caso anterior, imaginemos que queremos sumar los números en vez de imprimirlos, y enviar el total al canal:
var ch = make(chan int, 3)
func f(start, end int) { total := 0
for i := start; i < end; i++ { total += i
}
ch <- total }
func g() {
for n := range ch {
fmt.Println(«Number «, n) }
}
func main() {
defer close(ch)
go f(4, 7)
go f(7, 11)
f(1, 4)
go g() time.Sleep(time.Second) fmt.Println(«done»)
}
La forma de usar un canal difiere del objetivo que tengamos con él:
• Si es solo escritura, podemos indicar ch chan<-
• Si es solo lectura, ch <-chan
• Si es ambos, ch chan
En cuanto a la creación
ch := make(chan int) → Unbuffered: bloqueante hasta que otra goroutine recibe el valor
ch := make(chan int, 5) → Cuando conocemos la cantidad de datos que vamos a usar
Notas:
1: X puede ser 8, 16, 32 y 64. Si se usa int o uint, es dependiente de la plataforma.
2: Las diferencias entre hilos y goroutines son mínimas:
• Pila: ~2MB fijos para hilos; y 2KB para goroutines (pero puede crecer si es necesario)
• Scheduling: OS para hilos; multiplexación m:n para Go (m goroutines en n hilos)
• Identidad: ID único para hilos; goroutines no tienen