Concurrencia en Go
Go Channels
Send values between goroutines with channels: unbuffered, buffered, close and range.
Lo que aprenderás
- Send and receive
- close and range
- Buffered channels
Producer to main
- 1
out <- messageproducer goroutine - 2
chan stringstep 1, step 2, step 3 - 3
range messagesmain
A pipe between goroutines
A channel is a pipe that carries values from one goroutine to another. Sending and receiving wait for each other, so channels also keep goroutines in step.
out <- value sends and <-channel receives. An unbuffered channel hands each message directly to the receiver. close tells the receiver that nothing more will come, which ends the range loop. A buffered channel holds up to its capacity without a receiver.
Puntos clave
- ch <- v sends and <-ch receives.
- close ends a range loop.
- A buffered channel holds values without a receiver.
Ejemplo ejecutable de Go
main.go
package main
import "fmt"
func produce(steps int, out chan<- string) {
for step := 1; step <= steps; step++ {
out <- fmt.Sprintf("step %d done", step)
}
close(out) // tells the receiver there is nothing more
}
func main() {
messages := make(chan string)
go produce(3, messages)
for message := range messages {
fmt.Println("received:", message)
}
buffered := make(chan int, 2)
buffered <- 1
buffered <- 2
fmt.Println(len(buffered), <-buffered, <-buffered)
}
received: step 1 done
received: step 2 done
received: step 3 done
2 1 2Practica
Abre el ejemplo en el compilador online, cambia un valor o añade una línea y predice la salida antes de ejecutarlo. Después rompe el código a propósito y lee el mensaje del compilador.
¿Terminaste esta lección?
Márcala como aprendida para seguir tu progreso.
Tu progreso está guardado en este navegador Inicia sesión para conservarlo en todos tus dispositivos.
Practica con un reto
Usa lo que cubre esta lección para resolver un problema real. Cada reto se ejecuta en el navegador, con pruebas al instante y una revisión de IA.
Todos los retos