A veces leo un artículo que dice "Go está orientado a objetos". A veces, otro artículo afirma que no se puede hacer programación orientada a objetos con Go, simplemente porque no tiene clases.
Así que escribí esta publicación para aclarar este tema. ¿Go está orientado a objetos o no?
Si está acostumbrado a pensar en un idioma en particular, dependiendo del idioma del que provenga, es posible que tenga una opinión diferente sobre este tema. Por ejemplo, si viene de C, claramente Go tiene muchas más funciones de programación orientada a objetos. Viniendo de Java, el código de Go no parece muy orientado a objetos.
Lo que debe hacer en este caso es dejar de pensar en términos del "otro idioma" y pensar primero con una mentalidad de Go.
Esta es mi respuesta:sí, Go está orientado a objetos, y en unrefrescanteacuerdocamino.
losIr a preguntas frecuentesdice:
¿Go es un lenguaje orientado a objetos?
Si y no. Aunque Go tiene tipos y métodos y permite un estilo de programación orientado a objetos, no existe una jerarquía de tipos. El concepto de "interfaz" en Go proporciona un enfoque diferente que creemos que es fácil de usar y, de alguna manera, más general. También hay formas de incrustar tipos en otros tipos para proporcionar algo análogo, pero no idéntico, a las subclases. Además, los métodos en Go son más generales que en C ++ o Java: se pueden definir para cualquier tipo de datos, incluso los tipos integrados, como enteros sin formato "sin caja". No están restringidos a estructuras (clases).
Además, la falta de una jerarquía de tipos hace que los "objetos" en Go se sientan mucho más ligeros que en lenguajes como C ++ o Java.
Conceptos de selección de cerezas
Go eligió algunos conceptos de la programación procedimental, la programación funcional y la programación orientada a objetos, los juntó y dejó de lado otros conceptos para crear su propio estilo de programación idiomática.
Sin clases, ingrese estructuras
No hay clases en Go, en su concepto tradicional, pero Go tiene tipos de estructura, que son mucho más poderosos que susCcontrapartida. Los tipos de estructura más sus métodos asociados sirven al mismo objetivo de una clase tradicional, donde la estructura solo contiene el estado, no el comportamiento, y los métodos les proporcionan el comportamiento, al permitir cambiar el estado.
Encapsulamiento
Una de las mejores características de Go: los campos, métodos y funciones en mayúsculas son públicos. Todos los demás campos son locales del paquete y no se exportan. Con una sola mirada sabes si algo es público o privado. No hayprotegidoporque no hay herencia.
Sin herencia
No existe el concepto de herencia. De las preguntas frecuentes de Go:
La programación orientada a objetos, al menos en los lenguajes más conocidos, implica demasiada discusión sobre las relaciones entre tipos, relaciones que a menudo podrían derivarse automáticamente. Go adopta un enfoque diferente.
Composición sobre herencia
Estaprincipio bien conocido, también mencionado en el libro Gang of Four, se encuentra mucho en el código Go.
Al declarar una estructura, podemos agregar un campo sin nombre (anónimo), lo que hace que sus campos y sus métodos se expongan en la estructura. Se llamaincrustación de estructura:
package main
import (
“fmt”
)
type Dog struct {
Animal
}
type Animal struct {
Age int
}
func (a Animal) Move() {
fmt.Println(“Animal moved”)
}
func (a Animal) SayAge() {
fmt.Printf(“Animal age: %d\n”, a.Age)
}
func main() {
d := Dog{}
d.Age = 3
d.Move()
d.SayAge()
}
Interfaces
Olvídese de las interfaces de estilo Java y PHP. Las interfaces de Go son muy diferentes, y un concepto clave es que las interfaces se satisfacenimplícitamente.
De las preguntas frecuentes de Go:
En lugar de requerir que el programador declare de antemano que dos tipos están relacionados, en Go un tipo satisface automáticamente cualquier interfaz que especifique un subconjunto de sus métodos.
Las interfaces suelen ser muy pequeñas, hasta ser un solo método. No verá largas listas de métodos en Go idiomático.
Las interfaces proporcionan elegantementepolimorfismo: al aceptar una interfaz, declaras aceptar cualquier tipo de objeto que satisfaga esa interfaz.
Métodos
Los tipos tienen métodos. Se definen fuera de la definición de tipo, con una sintaxis que podría recordar laJavaScriptdefiniciones de método de prototipo:
function Person(first, last) {
this.firstName = first;
this.lastName = last;
}
Person.prototype.name = function() {
return this.firstName + " " + this.lastName;
};
p = new Person("Flavio", "Copes")
p.name() // Flavio Copes
en Go, el mismo código está escrito como:
package main
import (
“fmt”
)
type Person struct {
firstName string
lastName string
}
func (p Person) name() string {
return p.firstName + " " + p.lastName
}
func main() {
p := Person{“Flavio”, “Copes”}
fmt.Println(p.name())
}
Adjuntar métodos a tipos
Los métodos se pueden adjuntar a cualquier tipo, incluso a tipos de datos básicos. Dado que los métodos solo se pueden adjuntar en el mismo paquete donde se define el tipo, no podemos "enriquecer" los tipos básicos incorporados, pero podemos enriquecer cualquier tipo con nombre que creemos con una representación subyacente del tipo base:
package main
import (
“fmt”
)
type Amount int
func (a Amount) Add(add Amount) {
a += add
}
func main() {
var a Amount
a = 1
a.Add(2)
fmt.Println(a)
}
Funciones
Piense en un lenguaje de programación tradicional orientado a objetos como Java. ¿Cuántas veces definiste una clase "Utils" con métodos estáticos?
Esto es para solucionar la noción de que todo es un objeto y las definiciones de funciones deben estar dentro de las clases. Eso no pasa con Go, porque Go tiene funciones. No todo tiene que ser un objeto o un método en el mundo real. Las “clases” y los “objetos” son muy útiles pero no se pueden usar para todo.
En Go no todo es un objeto (y técnicamente nada es un objeto, pero algunas personas llaman a los valores de tipo y a las variables "objetos"), los métodos son funciones asociadas a un tipo, pero Go también permite que las funciones vivan fuera de un objeto, al igual que C funciones.
Entonces, aunque Go permite métodos, también permite funciones yfunciones de primera clase(las funciones se pueden almacenar como campos de estructura, se pueden pasar como argumentos a otras funciones, se pueden devolver desde una función o el valor de retorno de métodos).
Menos hinchazón
En general, la implementación de Go de la programación orientada a objetos es increíblementeflexibleydirecto. Dejando atrás las clases y la herencia, verá muy poco texto repetitivo y, en lugar de razonar sobre la estructura jerárquica perfecta para las clases, que se vuelve difícil de cambiar, tiene la libertad de componer y descomponer tipos según sea necesario.
Más tutoriales de go:
- Uso de NGINX Reverse Proxy para brindar servicios de Go
- Hacer una copia de una estructura en Go
- Los conceptos básicos de un servidor web Go
- Ordenar un tipo de mapa en Go
- Ir consejos en pocas palabras
- Explicación de las etiquetas Go
- Ir al formato de fecha y hora
- Procesamiento JSON con Go
- Ir a funciones variadas
- Hoja de referencia de Go Strings
- Explicación de la interfaz Go Empty
- Depuración de Go con VS Code y Delve
- Parámetros de devoluciones de Go Named
- Generación de cadenas y números aleatorios en Go
- Estructura del sistema de archivos de un proyecto de Go
- Algoritmo de búsqueda binaria implementado en Go
- Uso de indicadores de línea de comando en Go
- GOPATH explicado
- Cree una aplicación de línea de comandos con Go: lolcat
- Construyendo un comando CLI con Go: cowsay
- Uso de Shell Pipes con Go
- Tutorial de Go CLI: clon de la fortuna
- Enumere los archivos en una carpeta con Go
- Use Ir para obtener una lista de repositorios de GitHub
- Ve, agrega un trozo de cadenas a un archivo
- Ve, convierte una cadena en un segmento de bytes
- Visualice sus contribuciones locales de Git con Go
- Introducción a la creación de perfiles de memoria y CPU de Go
- Resolver el error "no admite la indexación" en un programa Go
- Medir el tiempo de ejecución en un programa Go
- Creación de un rastreador web con Go para detectar títulos duplicados
- Siga las mejores prácticas: ¿puntero o receptores de valor?
- Siga las mejores prácticas: ¿Debería utilizar un método o una función?
- Ir a estructuras de datos: Establecer
- Hoja de referencia de Go Maps
- Genere implementaciones para tipos genéricos en Go
- Ir a estructuras de datos: diccionario
- Ir a estructuras de datos: tabla hash
- Implementar oyentes de eventos en canales de paso
- Ir a estructuras de datos: apilar
- Ir a estructuras de datos: cola
- Ir a estructuras de datos: árbol de búsqueda binaria
- Ir a estructuras de datos: gráfico
- Ir a estructuras de datos: lista vinculada
- La guía completa de Go Data Structures
- Comparación de valores de Go
- ¿Go está orientado a objetos?
- Trabajar con una base de datos SQL en Go
- Usar variables de entorno en Go
- Ir al tutorial: API REST respaldada por PostgreSQL
- Habilitación de CORS en un servidor web Go
- Implementación de una aplicación Go en un contenedor Docker
- Por qué Go es un lenguaje poderoso para aprender como desarrollador PHP
- Ve, elimina el carácter de nueva línea io.Reader.ReadString
- Ir, cómo ver los cambios y reconstruir su programa
- Ve, cuenta los meses desde una fecha
- Acceder a los parámetros HTTP POST en Go