<h1>Estructuras: ¿Las Clases de Go (Golang)?
<p dir="auto"><em>Es un tema un tanto polémico el hecho de que <strong>Go sea o no un lenguaje de programación <em>Orientado a Objetos, ya lo había mencionado antes, pero considero que lo es, aunque soporta este paradigma de una manera bastante peculiar, puede profundizar un poco consultando <a href="https://es.wikipedia.org/wiki/Go_(lenguaje_de_programaci%C3%B3n)" target="_blank" rel="nofollow noreferrer noopener" title="This link will take you away from hive.blog" class="external_link">Wikipedia
<h2>Estructuras
<p dir="auto">Una estructura es sencillamente una colección de campos. Son lo más parecido a las clases en los lenguajes orientados a objetos tradicionales que encontrarán en <strong>Go y, en mi opinión, una de las mejores características que nos ofrece el lenguaje.
<pre><code>package main
import "fmt"
type Persona struct {
Nombre string
Apellido string
Edad uint8
}
func main() {
var p Persona
fmt.Println(p) // { 0}
}
<p dir="auto"><br /><br />
Sinceramente espero no revivir los traumas universitarios de nadie, pero el ejemplo con <code>Persona ya es un clásico cuándo hablamos de Programación Orientada a Objetos. Probablemente noten el parecido con las <em>clases de otros lenguajes de programación, de hecho, podemos acceder a los valores de los campos de la estructura a través de la notación de puntos, por ejemplo <code>Persona.Nombre.
<p dir="auto">Al igual que con los tipos personalizados que vimos en la <a href="https://steemit.com/cervantes/@orlmicron/tipos-de-datos-personalizados-y-metodos-en-go-golang" target="_blank" rel="nofollow noreferrer noopener" title="This link will take you away from hive.blog" class="external_link">publicación anterior, utilizamos la palabra reservada <code>type para declarar una estructura, seguida del nombre y el tipo <code>struct. Dentro de las llaves establecemos todos los campos de nuestra estructura identificados con el tipo de dato correspondiente en cada caso.
<p dir="auto">Otro detalle importante es que el valor <em>cero de una estructura es una colección de los valores <em>cero de sus campos, por tal motivo, la impresión de la variable <code>p nos muestra dos cadenas vacías y un <code>0. Agreguemos algunos valores.
<pre><code>...
func main() {
var p Persona
p.Nombre = "Orlando"
p.Apellido = "Monteverde"
p.Edad = 26
fmt.Println(p) // {Orlando Monteverde 26}
}
<p dir="auto"><br /><br />
Esta vez podemos ver los datos que pasamos a la estructura, también es posible hacerlo esta manera <code>p = Persona{"Orlando", "Monteverde", 26}, el resultado sería el mismo. Incluso usando la declaración corta <code>p := Persona{"Orlando", "Monteverde", 26} nos ahorramos una línea. Perfecto, ya sabemos como crear estructuras y modificar sus valores, veamos algunas cosas interesantes.
<h2>Métodos
<p dir="auto">En la <a href="https://steemit.com/cervantes/@orlmicron/tipos-de-datos-personalizados-y-metodos-en-go-golang" target="_blank" rel="nofollow noreferrer noopener" title="This link will take you away from hive.blog" class="external_link">publicación anterior conocimos los métodos, así que asumiré que ya todos los conocemos. De la misma forma en la que declaramos métodos para los tipos personalizados, podemos hacerlo para las estructuras.
<pre><code>...
func (p Persona) Saludar() {
fmt.Printf("Hola, mi nombre es %s %s y tengo %d años\n",
p.Nombre, p.Apellido, p.Edad)
}
func main() {
p := Persona{"Orlando", "Monteverde", 26}
p.Saludar()
Hola, mi nombre es Orlando Monteverde y tengo 26 años
}
<p dir="auto"><br /><br />
Sólo con estas <em>propiedades y <em>métodos es imposible no pensar en <em>clases, claro, si vienes de un lenguaje <em>orientado a objetos, si no es así, ni te preocupes, <strong>Go es asombroso y nos hace las cosas sencillas. Vamos a crear método.
<pre><code>...
func (p Persona) Cumpleanios() {
p.Edad += 1
}
func main() {
p := Persona{"Orlando", "Monteverde", 26}
p.Cumpleanios()
p.Saludar()
// Hola, mi nombre es Orlando Monteverde y tengo 26 años
}
<p dir="auto"><br /><br />
El método pudo llamarse <em>cumpleaños porque <strong>Go trabaja por defecto con <em>UTF-8, pero no es recomendable usar tildes o caracteres especiales en los identificadores, de hecho, lo más recomendable es utilizar palabras en inglés, pero intento mantener las cosas lo más simples y comprensibles que pueda. Volviendo al código, nada cambió, aun después de ejecutar el método <code>Cumpleanios, la edad continua siendo <code>26, si han estado siguiendo esta serie deberían saber la razón, de cualquier forma, la solución está en los <em>punteros. Hagamos un par de ajustes al método.
<pre><code>…
func (p *Persona) Cumpleanios() {
(*p).Edad += 1
}
<p dir="auto"><br /><br />
Con esto logramos nuestro propósito, al ejecutar el método <code>Cumpleanios la edad de nuestra persona se incrementa en uno. Es importante resaltar los paréntesis en la sentencia <code>(*p).Edad += 1, si recuerdan el artículo de <a href="https://steemit.com/cervantes/@orlmicron/punteros-en-go-golang" target="_blank" rel="nofollow noreferrer noopener" title="This link will take you away from hive.blog" class="external_link">punteros sabrán que el asterisco antes de la una variable de tipo <em>puntero nos permite acceder a su valor y para aplicar esto en las estructuras requerimos los paréntesis, sin embargo, esta sintaxis no es muy práctica y <strong>Go nos permite el mismo resultado de esta manera <code>p.Edad += 1, mucho mejor.
<h2>Campos anónimos
<p dir="auto">En <strong>Go no existe la <strong>herencia como en otros lenguajes orientados a objetos, sin embargo, muchas veces tendremos estructuras que comparten características con otras, pero claro, las personas detrás de este lenguaje ya pensaron es esto, y lo solucionaron de una manera bastante sencilla. Partiendo del ejemplo anterior, si ahora creamos una nueva estructura a la que llamaremos <code>Programador y como los programadores somos personas, o eso me han contado, sería práctico tomar las características de la estructura <code>Persona en lugar de reescribirlas en la nueva estructura. Veamos el código.
<pre><code>package main
import "fmt"
type Persona struct {
Nombre string
Apellido string
Edad uint8
}
type Programador struct {
Persona
Especialidad string
LenguajesFavoritos []string
}
func (p Persona) Saludar() {
fmt.Printf("Hola, mi nombre es %s %s y tengo %d años\n",
p.Nombre, p.Apellido, p.Edad)
}
func (p *Persona) Cumpleanios() {
p.Edad += 1
}
func (p Programador) beberCafe() {
fmt.Println("¡Me siento vivo!")
}
func main() {
p := Programador{
Persona{"Orlando", "Monteverde", 26},
"Desarrollo Web",
[]string{"Go", "Python", "JavaScript"},
}
p.Cumpleanios()
p.Saludar() // Hola, mi nombre es Orlando Monteverde y tengo 27 años
p.beberCafe() // ¡Me siento vivo!
fmt.Println(p.Persona) // {Orlando Monteverde 27}
fmt.Println(p) // {{Orlando Monteverde 27} Desarrollo Web [Go Python JavaScript]}
}
<p dir="auto"><br /><br />
Si quiero que <code>Programador comparta los campos y métodos de <code>Persona es suficiente con introducir <code>Persona como un campo de la estructura <code>Programador, no ser podría ser más sencillo. Este es un campo anónimo porque efectivamente no tiene nombre, pero podemos acceder a él de igual forma que al resto de los campos, por medio de la notación de punto.
<p dir="auto">Esta publicación ya se ha hecho bastante larga, aún quedan detalles por tratar sobre las estructuras pero continuaremos trabajando con ellas en el futuro, de hecho ha sido difícil realizar muchos de los ejemplos anteriores sin involucrar a las estructuras.
<p dir="auto"><center><img src="https://images.hive.blog/768x0/https://cdn.steemitimages.com/DQmXF55A7pDHvVu4K73h6TgCoH5UpC1WUHFAFhn76NUVgUC/separator.png" alt="separator.png" srcset="https://images.hive.blog/768x0/https://cdn.steemitimages.com/DQmXF55A7pDHvVu4K73h6TgCoH5UpC1WUHFAFhn76NUVgUC/separator.png 1x, https://images.hive.blog/1536x0/https://cdn.steemitimages.com/DQmXF55A7pDHvVu4K73h6TgCoH5UpC1WUHFAFhn76NUVgUC/separator.png 2x" />
<h2>Publicaciones relacionadas
<ol>
<li><p dir="auto"><a href="https://steemit.com/cervantes/@orlmicron/de-python-a-go-golang" target="_blank" rel="nofollow noreferrer noopener" title="This link will take you away from hive.blog" class="external_link">De Python a Go (Golang)
<li><p dir="auto"><a href="https://steemit.com/cervantes/@orlmicron/introduccion-al-lenguaje-de-programacion-go-golang" target="_blank" rel="nofollow noreferrer noopener" title="This link will take you away from hive.blog" class="external_link">Introducción al lenguaje de programación Go (Golang)
<li><p dir="auto"><a href="https://steemit.com/cervantes/@orlmicron/estructuras-de-control-de-flujo-en-go" target="_blank" rel="nofollow noreferrer noopener" title="This link will take you away from hive.blog" class="external_link">Estructuras de control de flujo en Go
<li><p dir="auto"><a href="https://steemit.com/cervantes/@orlmicron/array-y-slice-en-go-golang" target="_blank" rel="nofollow noreferrer noopener" title="This link will take you away from hive.blog" class="external_link">Array y Slice en Go (Golang)
<li><p dir="auto"><a href="https://steemit.com/cervantes/@orlmicron/maps-en-go-golang" target="_blank" rel="nofollow noreferrer noopener" title="This link will take you away from hive.blog" class="external_link">Maps en Go (Golang)
<li><p dir="auto"><a href="https://steemit.com/cervantes/@orlmicron/punteros-en-go-golang" target="_blank" rel="nofollow noreferrer noopener" title="This link will take you away from hive.blog" class="external_link">Punteros en Go (Golang)
<li><p dir="auto"><a href="https://steemit.com/cervantes/@orlmicron/importaciones-y-paquetes-en-go-golang" target="_blank" rel="nofollow noreferrer noopener" title="This link will take you away from hive.blog" class="external_link">Importaciones y paquetes en Go (Golang)
<li><p dir="auto"><a href="https://steemit.com/cervantes/@orlmicron/paquetes-de-terceros-y-alias-en-go-golang" target="_blank" rel="nofollow noreferrer noopener" title="This link will take you away from hive.blog" class="external_link">Paquetes de terceros y alias en Go (Golang)
<li><p dir="auto"><a href="https://steemit.com/cervantes/@orlmicron/tipos-de-datos-personalizados-y-metodos-en-go-golang" target="_blank" rel="nofollow noreferrer noopener" title="This link will take you away from hive.blog" class="external_link">Tipos de datos Personalizados y Métodos en Go (Golang)
<p dir="auto">Gracias por leer, espero que este artículo te resultara de provecho. Si así fue, no dudes en dejar un <strong>comentario, <strong>compartirlo y <strong>votar. Te invito a comentar cualquier <strong>duda o <strong>sugerencia, te aseguro que las leo todas. Así que, por favor, ayúdame a mejorar y continuar compartiendo contenido de calidad. Si te gusta la programación y/o la informática en general, te invito a formar parte de la comunidad <a href="https://discordapp.com/invite/8cFAFTZ" target="_blank" rel="nofollow noreferrer noopener" title="This link will take you away from hive.blog" class="external_link">Develop Spanish dónde compartimos contenido de esa naturaleza y totalmente en español. Hasta la próxima.
<p dir="auto"><img src="https://images.hive.blog/768x0/https://cdn.steemitimages.com/DQmQU5fep6GDnVe1KD4jRgxwD6DcBNvwWPTx82DKBWeciew/banner-steemit.jpg" alt="banner-steemit.jpg" srcset="https://images.hive.blog/768x0/https://cdn.steemitimages.com/DQmQU5fep6GDnVe1KD4jRgxwD6DcBNvwWPTx82DKBWeciew/banner-steemit.jpg 1x, https://images.hive.blog/1536x0/https://cdn.steemitimages.com/DQmQU5fep6GDnVe1KD4jRgxwD6DcBNvwWPTx82DKBWeciew/banner-steemit.jpg 2x" />
Saludos @orlmicron Veo que te gusta la programación y tienes talento para compartir. Te sugiero colocar los enlaces de la primera y última imagen, ya que se requiere que no tengan derechos de autor para poder recibir el apoyo de la comunidad científica #stem-espanol, además deberías incluir algunas referencias bibliográficas. Si deseas conocer más visita el blog de @stem-espanol. Suerte
Go, hasta donde sé, por lo que preferí explicarlo con mis propias palabras, aunque siempre es bueno consultar la Documentación del Lenguaje. Hasta la próxima.Saludos, @iamphysical. Efectivamente, me apasiona la programación. Gracias por las recomendaciones, las imágenes no tienen enlaces de fuente porque son de mi autoría. Respecto a las citas, normalmente cito a Wikipedia, pero las estructuras son propias de
¿Quieres recibir mejores recompensas en tus post de informática, tecnología o programación, ayúdanos delegando algo de SP:
1 SP, 5 SP, 10 SP
This post has been voted on by the steemstem curation team and voting trail.
There is more to SteemSTEM than just writing posts, check here for some more tips on being a community member. You can also join our discord here to get to know the rest of the community!
Thank you very much, @steemstem. I'm glad you paid attention in my post.