¿Go está orientado a objetos?

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:, 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() }

tocar

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) }

tocar

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: