Skip to content

Commit 7bf7c0c

Browse files
authored
Merge pull request mouredev#7315 from MiguelP-Dev/main
09 - Go
2 parents 2c64d0e + 989a173 commit 7bf7c0c

File tree

1 file changed

+139
-0
lines changed

1 file changed

+139
-0
lines changed
Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
)
6+
7+
/*
8+
En 'Golang' no existe la herencia como en otros lenguajes, pero existe la composición.
9+
Esto no es un problema de diseño, el lenguaje está diseñado de esta manera
10+
en parte para evitar las jerarquías de tipo y evitar realizar un sobrediseño temprano en la solución.
11+
así evitamos hacerla más compleja(pero no más funcional).
12+
13+
Composición: Facil de testear, DI/DIP(Inyección de dependencias/Principio de inversión de dependencias).
14+
Golang nos ofrece caracteristicas que van más allá:
15+
- Métodos que pueden usarse en diferentes tipos declarados.(maps, structs, slices, y otros tipos)
16+
- Interfaces implicitas: No necesitamos usar la palabra reservada 'Implements', ya que golang verifica si nuesto tipo
17+
tiene los métodos que requiere la interface y esto es muy util ya que varios tipos puenden satisfacer a una interface
18+
y no hace falta especificar que el tipo 'X' implementa a las interfaces '1', '2', '3', etc...
19+
- Incrustación de cammpos: Permite integrar tipos en otros tipos y esto no es analogo a las clases, pero no es idéntico.
20+
21+
Golang no posee las funciones setter y getter aunque estas se pueden diseñar de manera simple com métodos.
22+
23+
Tipos: En golang existen muchos tipos; como los predeclarados: string, float, int, etc...
24+
también los tipos compuestos como los arreglos, maps, slice, estructs, etc...
25+
Pero adicionalmente existen tipos compuestos, estos tienen ciertas condiciones como ser referenciados en el mismo
26+
paquete en que los declaramos.
27+
por eso no podemos añadir funcionalidades a los tipos predeclarados, pero lo que si podemos es construir un nuevo tipo a partir de uno
28+
predeclarado y añadirle nuevas funcionalidades
29+
30+
Golang tampoco posee sobreescritura de métodos, en cambio tiene ocultación de métodos, aunque hay que tener cuidado cone esto
31+
porque pueden generarse conflictos.
32+
33+
por ejemplo cuando tienes un capo de nombre en dos estructuras "Humano y Empleado" y embebemos empleado en humano para obtener sus métodos
34+
y atributos, puede haber conflicto al llamar el nombre, esto se soluciona llamando el nombre espesificando si lo queremos de la clase humano o
35+
la clase empleado.
36+
37+
fmt.Println(e.Human.age) o fmt.Println(e.Employee.age) dependiendo desde de clase se requiera.
38+
*/
39+
40+
// newBool nuevo tipo a partir de un tipo predeclarado
41+
type newBool bool
42+
43+
// String es el método de un nuevo tipo a partir de uno predeclarado
44+
func (b newBool) String() string {
45+
if b {
46+
return "VERDADERO"
47+
}
48+
return "FALSO"
49+
}
50+
51+
// Composición de estructuras.
52+
// character es una clase padre
53+
type character struct {
54+
name string
55+
race string
56+
atack bool
57+
}
58+
59+
// animal es la clase padre
60+
type animal struct {
61+
animalType string
62+
sound string
63+
}
64+
65+
// sound es método de la clase padre animal
66+
func (a animal) makeSound() {
67+
fmt.Println(a.animalType, " dice: ", a.sound)
68+
}
69+
70+
// instancias con asignación directa de la clase padre "animal"
71+
var cat = animal{animalType: "Gato", sound: "Miau"}
72+
var dog = animal{animalType: "Perro", sound: "Guau"}
73+
74+
// NewCharacter es el constructor de caracteres
75+
func NewCharacter(name, animalType string, atack bool) character {
76+
return character{name, animalType, atack}
77+
}
78+
79+
// Extra
80+
81+
// employee es la clase padre del ejercio extra
82+
type employee struct {
83+
id int
84+
name string
85+
position string
86+
}
87+
88+
// manager es una subclase de empleado
89+
type manager struct {
90+
employee
91+
employees []employee
92+
}
93+
94+
// projectManager es una subclase de empleado
95+
type projectManager struct {
96+
manager
97+
projects []string
98+
}
99+
100+
// programmer es la subclase de empleado
101+
type programmer struct {
102+
employee
103+
languages []string
104+
}
105+
106+
func main() {
107+
monster := NewCharacter("Golg", "Dragon", true)
108+
fmt.Println("Nombre: ", monster.name)
109+
fmt.Println("Raza: ", monster.race)
110+
fmt.Println("¿Ataca?: ", monster.atack)
111+
112+
// Método impresor de sonido de los nimales
113+
cat.makeSound()
114+
dog.makeSound()
115+
116+
// Extra
117+
employee1 := employee{id: 1, name: "Miguel", position: "Programmer"}
118+
employee2 := employee{id: 2, name: "Ricardo", position: "Manager"}
119+
employee3 := employee{id: 3, name: "Vicente", position: "Project Manager"}
120+
manager1 := manager{employee: employee1, employees: []employee{employee2, employee3}}
121+
projectManager1 := projectManager{manager: manager1, projects: []string{"Project 1", "Project 2"}}
122+
programmer1 := programmer{employee: employee1, languages: []string{"Go", "Python", "Java"}}
123+
programmer2 := programmer{employee: employee3, languages: []string{"Java", "C#"}}
124+
125+
fmt.Println("Employee 1: ", employee1)
126+
fmt.Println("Employee 2: ", employee2)
127+
fmt.Println("Employee 3: ", employee3)
128+
fmt.Println("Manager 1: ", manager1)
129+
fmt.Println("Project Manager 1: ", projectManager1)
130+
fmt.Println("Programmer 1: ", programmer1)
131+
fmt.Println("Programmer 2: ", programmer2)
132+
133+
// nuevo tipo a partir de uno predeclarado y con nueva funcionalidad(Simple)
134+
var b newBool = true
135+
fmt.Println(b.String())
136+
b = false
137+
fmt.Println(b.String())
138+
139+
}

0 commit comments

Comments
 (0)