1
+ /*
2
+ NOTA IMPORTANTE:
3
+ Go no tiene clases como tal, pero se pueden simular con structs(estructuras)
4
+ y métodos asociados a ellas.
5
+ En este ejemplo se simulan las estructuras de pila y cola, y se les agregan
6
+ métodos para realizar operaciones sobre ellas.
7
+ Los metodos se definen con la estructura a la que pertenecen como primer
8
+ argumento el cual se llama receptor.
9
+ */
10
+
11
+ package main
12
+
13
+ import "fmt"
14
+
15
+ // Simulacion de clase "Car" con métodos asociados
16
+ type Car struct {
17
+ brand string // atributos
18
+ model string
19
+ year int
20
+ }
21
+
22
+ // Método asociado a la estructura "Car"
23
+ func (car Car ) printInfo () string {
24
+ return fmt .Sprintf ("Marca: %s, Modelo: %s, Año: %d" , car .brand , car .model , car .year )
25
+ }
26
+
27
+ // Método asociado a la estructura "Car"
28
+ func (car * Car ) changeBrand (newBrand string ) {
29
+ car .brand = newBrand
30
+ }
31
+
32
+ // Estructura de pila de números (LIFO)
33
+ type Stack [T any ] struct {
34
+ data []T
35
+ }
36
+
37
+ // Saber si la pila está vacía
38
+ func (stack * Stack [T ]) IsEmpty () bool {
39
+ return len (stack .data ) == 0
40
+ }
41
+
42
+ // Agrega un número a la pila
43
+ func (stack * Stack [T ]) Push (element T ) {
44
+ stack .data = append (stack .data , element )
45
+ }
46
+
47
+ // Elimina y recupoera/devuelve el último número agregado a la pila. Regresa false si la pila está vacía
48
+ func (stack * Stack [T ]) Pop () (T , bool ) {
49
+ if stack .IsEmpty () {
50
+ var zeroValue T
51
+ return zeroValue , false
52
+ } else {
53
+ index := len (stack .data ) - 1 // Indice del último elemento
54
+ element := stack .data [index ] // Último elemento
55
+ stack .data = stack .data [:index ] // Elimina el último elemento por su indice
56
+ return element , true
57
+ }
58
+ }
59
+
60
+ // Estrucutra de cola de números (FIFO)
61
+ type Queue [T any ] struct {
62
+ data []T
63
+ }
64
+
65
+ // Saber si la cola está vacía
66
+ func (queue * Queue [T ]) IsEmpty () bool {
67
+ return len (queue .data ) == 0
68
+ }
69
+
70
+ // Agrega un número a la cola
71
+ func (queue * Queue [T ]) Enqueue (element T ) {
72
+ queue .data = append (queue .data , element )
73
+ }
74
+
75
+ // Elimina y recupera/devuelve el primer número agregado a la cola. Regresa false si la cola está vacía
76
+ func (queue * Queue [T ]) Dequeue () (T , bool ) {
77
+ if queue .IsEmpty () {
78
+ var zeroValue T
79
+ return zeroValue , false
80
+ } else {
81
+ element := queue .data [0 ] // Accedemos al Primer elemento
82
+ queue .data = queue .data [1 :] // Elimina el primer elemento
83
+ return element , true
84
+ }
85
+ }
86
+
87
+ func main () {
88
+
89
+ // Simulacion de clase "Car"
90
+ car1 := Car {brand : "Ford" , model : "Fiesta" , year : 2019 }
91
+ fmt .Println (car1 .printInfo ())
92
+ car1 .changeBrand ("Chevrolet" )
93
+ fmt .Println (car1 .printInfo ())
94
+
95
+ // Extra: Stack / Pila
96
+ stack := Stack [string ]{}
97
+ fmt .Println ("Pila vacía: " , stack .IsEmpty ())
98
+ stack .Push ("1" )
99
+ stack .Push ("2" )
100
+ stack .Push ("3" )
101
+ fmt .Println ("Pila:" + fmt .Sprint (stack .data ))
102
+ fmt .Println ("Ahora se eliminara el ultimo elemento de la pila..." )
103
+ stack .Pop ()
104
+ fmt .Println ("Pila:" + fmt .Sprint (stack .data ))
105
+
106
+ // Extra: Queue / Cola
107
+ queue := Queue [int ]{}
108
+ fmt .Println ("Cola vacía: " , queue .IsEmpty ())
109
+ queue .Enqueue (1 )
110
+ queue .Enqueue (2 )
111
+ queue .Enqueue (3 )
112
+ fmt .Println ("Cola:" + fmt .Sprint (queue .data ))
113
+ fmt .Println ("Ahora se eliminara el primer elemento de la cola..." )
114
+ queue .Dequeue ()
115
+ fmt .Println ("Cola:" + fmt .Sprint (queue .data ))
116
+
117
+ }
0 commit comments