1+ package main
2+
3+ import (
4+ "fmt"
5+ "time"
6+ )
7+
8+ // NOTA: Un callback es una función que se pasa como argumento a otra función.
9+
10+ // Definimos un tipo para la funcion callback, en este caso recibe un entero y devuelve un entero
11+ type Callback func (int ) int
12+
13+ // Definimos una funcion que aplique una operacion al numero que recibe y devuelve el resultado
14+ func applyCallback (num int , callback Callback ) int {
15+ return callback (num )
16+ }
17+
18+ func main () {
19+ // Definimos una funcion que multiplica por 2 el numero.
20+ duplica := func (num int ) int {
21+ return num * 2
22+ }
23+
24+ // Definimos otra funcion que suma el numero con 10
25+ suma := func (num int ) int {
26+ return num + 10
27+ }
28+
29+ // Aplicamos la funcion duplicar al numero 5
30+ fmt .Println ("Resultado de multiplicar 5 por 2:" , applyCallback (5 , duplica ))
31+
32+ // Aplicamos la funcion triplicar al numero 5
33+ fmt .Println ("Resultado de sumar 15 con 10:" , applyCallback (15 , suma ))
34+
35+ // Extra
36+ simuladorPedidos ()
37+
38+ }
39+
40+ func simuladorPedidos () {
41+
42+ // Definimos las funciones de confirmacion, listo y entrega
43+ confirmacion := func (num int ) int {
44+ fmt .Println ("Pedido confirmado" )
45+ return num
46+ }
47+
48+ listo := func (num int ) int {
49+ fmt .Println ("Plato listo" )
50+ return num
51+ }
52+
53+ entrega := func (num int ) int {
54+ fmt .Println ("Pedido entregado" )
55+ return num
56+ }
57+
58+ // Simulamos un pedido de pizza
59+ procesarPedido ("Pizza" , confirmacion , listo , entrega )
60+
61+ // Simulamos un pedido de hamburguesa
62+ procesarPedido ("Hamburguesa" , confirmacion , listo , entrega )
63+ }
64+
65+ func procesarPedido (plato string , confirmacion , listo , entrega Callback ) {
66+ fmt .Println ("Procesando pedido de" , plato )
67+
68+ time .Sleep (time .Duration (1 + time .Now ().Nanosecond ()% 10 ) * time .Second ) // Simulamos un tiempo aleatorio entre 1 y 10 segundos
69+ confirmacion (1 )
70+
71+ time .Sleep (time .Duration (1 + time .Now ().Nanosecond ()% 10 ) * time .Second )
72+ listo (2 )
73+
74+ time .Sleep (time .Duration (1 + time .Now ().Nanosecond ()% 10 ) * time .Second )
75+ entrega (3 )
76+ }
0 commit comments