Go programación orientada a objetos
Go ·Backend
Curso de programación orientada a objetos en Go siguiendo el estilo idiomático del lenguaje, pensado para perfiles que llegan desde Java, C# o TypeScript. Trabajas modelado con structs y métodos, composición por embedding como alternativa a la herencia, interfaces implícitas y pequeñas, polimorfismo estructural, manejo explícito de errores y patrones idiomáticos como constructores y opciones funcionales. Al terminar diseñas dominios en Go sin arrastrar patrones heredados de otros lenguajes.
¿Prefieres verlo en directo? Agenda una demo sin compromiso.
Formación corporativa: este curso se activa bajo pedido para tu organización. Adaptamos temario, calendario y modalidad (teleformación, aula virtual o mixto).
Contenido del curso
Lenguaje eficiente y concurrente creado por Google.
-
Introducción a Go Lección
-
Instalación y primer programa de Go Lección
-
Instalación Go primer programa Ejercicio
Detalles del curso
Go es un lenguaje de programación moderno desarrollado por Google que combina la eficiencia de lenguajes compilados con la simplicidad sintáctica de lenguajes interpretados. Aunque Go no implementa la programación orientada a objetos (POO) de manera tradicional como Java o C++, ofrece mecanismos elegantes y potentes alternativas que permiten aplicar los principios fundamentales de la POO de forma pragmática y eficiente.
Fundamentos de la programación orientada a objetos en Go
Go adopta un enfoque minimalista hacia la POO, eliminando la herencia de clases y la jerarquía de tipos en favor de un sistema basado en interfaces y composición. Esta filosofía de diseño, conocida como "composición sobre herencia", permite crear código más modular, testeable y menos propenso a los problemas típicos de las jerarquías de clases profundas.
Structs: la base de los "objetos" en Go
En lugar de clases, Go utiliza estructuras (structs) como el bloque fundamental para modelar datos. Las structs permiten agrupar campos relacionados bajo un mismo tipo, similar a cómo funcionan las clases en otros lenguajes:
type Persona struct {
Nombre string
Edad int
Email string
}
A diferencia de las clases tradicionales, las structs en Go son tipos de datos que solo contienen estado (campos), sin métodos incorporados directamente en su definición.
Métodos con receptores: comportamiento para los tipos
Go implementa el comportamiento de los objetos mediante métodos con receptores, que son funciones asociadas a un tipo específico:
// Método con receptor por valor
func (p Persona) Saludar() string {
return fmt.Sprintf("Hola, me llamo %s y tengo %d años", p.Nombre, p.Edad)
}
// Método con receptor por puntero
func (p *Persona) CumplirAnios() {
p.Edad++
}
Esta separación entre datos (structs) y comportamiento (métodos) ofrece una flexibilidad única que permite añadir métodos incluso a tipos que no hemos definido nosotros, siempre que estén en nuestro paquete.
Polimorfismo a través de interfaces
El polimorfismo en Go se implementa mediante interfaces, que definen conjuntos de métodos sin implementación:
type Saludador interface {
Saludar() string
}
Una característica distintiva de Go es que los tipos implementan interfaces implícitamente, sin necesidad de declararlo. Cualquier tipo que implemente todos los métodos de una interfaz automáticamente satisface esa interfaz:
// Animal implementa implícitamente la interfaz Saludador
type Animal struct {
Especie string
}
func (a Animal) Saludar() string {
return fmt.Sprintf("Soy un %s", a.Especie)
}
// Ambos tipos pueden usarse polimórficamente
func SaludarATodos(saludadores []Saludador) {
for _, s := range saludadores {
fmt.Println(s.Saludar())
}
}
Esta implementación implícita de interfaces promueve un acoplamiento débil entre componentes y facilita la creación de código modular y testeable.
Composición en lugar de herencia
Go rechaza la herencia tradicional en favor de la composición de tipos, lo que permite construir tipos complejos mediante la inclusión de otros tipos:
type Direccion struct {
Calle string
Ciudad string
CP string
}
type Empleado struct {
Persona // Composición anónima
Direccion // Composición anónima
Salario float64
Empresa string
}
La composición anónima permite acceder directamente a los campos y métodos del tipo embebido, simulando algunos aspectos de la herencia pero sin sus desventajas:
emp := Empleado{
Persona: Persona{Nombre: "Ana", Edad: 30},
Salario: 45000,
}
// Acceso directo a campos del tipo embebido
fmt.Println(emp.Nombre) // "Ana"
Esta aproximación fomenta la reutilización de código sin crear jerarquías rígidas de tipos.
Generics: flexibilidad con seguridad de tipos
Desde Go 1.18, el lenguaje incorpora tipos genéricos que permiten escribir funciones y tipos que operan con diferentes tipos de datos manteniendo la seguridad de tipos:
// Función genérica para encontrar el mínimo de dos valores
func Min[T constraints.Ordered](a, b T) T {
if a < b {
return a
}
return b
}
// Tipo genérico para una pila
type Stack[T any] struct {
items []T
}
func (s *Stack[T]) Push(item T) {
s.items = append(s.items, item)
}
func (s *Stack[T]) Pop() (T, bool) {
var zero T
if len(s.items) == 0 {
return zero, false
}
n := len(s.items) - 1
item := s.items[n]
s.items = s.items[:n]
return item, true
}
Los generics resuelven muchas limitaciones previas de Go, permitiendo crear estructuras de datos y algoritmos reutilizables sin sacrificar la seguridad de tipos ni el rendimiento.
Manejo de errores en Go
Go adopta un enfoque explícito para el manejo de errores, tratándolos como valores retornados por funciones en lugar de excepciones:
func DividirEnteros(a, b int) (int, error) {
if b == 0 {
return 0, errors.New("división por cero")
}
return a / b, nil
}
// Uso
resultado, err := DividirEnteros(10, 0)
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Println("Resultado:", resultado)
Este patrón fomenta la verificación explícita de errores y evita los problemas asociados con las excepciones no controladas.
Errores personalizados y trazabilidad
Go permite crear tipos de error personalizados que pueden contener información adicional sobre el contexto del error:
type DivisionError struct {
Dividendo int
Divisor int
Mensaje string
}
func (e *DivisionError) Error() string {
return fmt.Sprintf("%s: %d / %d", e.Mensaje, e.Dividendo, e.Divisor)
}
func DividirConContexto(a, b int) (int, error) {
if b == 0 {
return 0, &DivisionError{
Dividendo: a,
Divisor: b,
Mensaje: "división por cero",
}
}
return a / b, nil
}
Desde Go 1.13, el paquete errors incluye funciones como Unwrap, Is y As que mejoran la trazabilidad de errores y permiten encadenarlos manteniendo el contexto:
func ProcesarDatos(datos []int) error {
resultado, err := procesarInterno(datos)
if err != nil {
return fmt.Errorf("error al procesar datos: %w", err)
}
// Continuar procesamiento...
return nil
}
Otros cursos de Go
Go Sintaxis Básica
Curso de sintaxis fundamental para incorporarte a un equipo que usa Go en servicios backend, CLIs u operadores cloud-native. Trabajas instalación del toolchain oficial, tipos primitivos, variables y constantes, operadores y control de flujo, arrays, slices, mapas, funciones con múltiples retornos y el patrón idiomático de errores explícitos. Al terminar tienes la base imprescindible para abordar después structs, interfaces, concurrencia y APIs HTTP en Go.
Go: concurrencia y cancelación con context
Curso para dominar el modelo concurrente de Go, el rasgo que más diferencia al lenguaje en servicios backend. Trabajas goroutines y grupos de espera, comunicación segura con canales, sincronización con mutex y select, prevención de condiciones de carrera y propagación de cancelación y timeouts con contexto en APIs HTTP y workers. Al terminar diseñas servicios concurrentes que no fugan goroutines y respetan límites de tiempo bajo carga.
Go: I/O, datos, CLI y runtime moderno
Curso práctico para entregar binarios Go que tocan disco, red y base de datos con el mismo ejecutable. Trabajas entrada y salida con ficheros y streams, serialización JSON, recursos incrustados en binario, persistencia en PostgreSQL, construcción de CLIs con flags, iteradores modernos del lenguaje y logging estructurado para observabilidad. Al terminar entregas servicios y herramientas de línea de comandos desplegables con configuración mínima y trazas útiles en producción.
Go: pruebas, benchmarks y módulos
Curso de calidad y empaquetado para proyectos Go que ya están en producción o se publican como librerías compartidas. Trabajas pruebas de tabla y subtests, benchmarks para detectar regresiones de rendimiento, fuzzing para entradas aleatorias, gestión de dependencias reproducibles con módulos y monorepos ligeros con workspaces. Al terminar entregas paquetes Go con tests fiables, dependencias auditables y un pipeline de CI verde.
¿Formación para tu equipo en esta tecnología?
Tú nos dices a quién formar y nosotros configuramos la plataforma con tu marca, damos de alta a tu gente, evaluamos las entregas con IA y te entregamos los certificados y los informes técnicos para tu gestor FUNDAE. Catálogo amplio con teleformación, aula virtual o mixto. Sin permanencia, sin coste de setup.
¿Prefieres verlo en directo? Agenda una demo.
Preguntas frecuentes
- ¿Go programación orientada a objetos es bonificable por FUNDAE para mi empresa?
- Puede ser bonificable cuando la acción cumple los requisitos aplicables. La plataforma aporta evidencias técnicas: seguimiento de tiempos, registro de conexiones, foros, encuestas y certificados para que tu entidad organizadora o gestoría revise la documentación.
- ¿En qué modalidades se imparte Go programación orientada a objetos?
- En tres modalidades: teleformación (online asíncrona), aula virtual privada en directo y mixta. Adaptamos temario, calendario y modalidad al equipo.
- ¿Se adapta Go programación orientada a objetos al nivel de mi equipo?
- Sí. Adaptamos temario, calendario y modalidad al nivel y al stack del equipo, con ejercicios evaluados por IA y certificado verificable.
- ¿Cuánto tarda en activarse para mi empresa?
- La activación corporativa estándar es rápida, sin coste de setup ni permanencia.