Punteros en Go (Golang)steemCreated with Sketch.

in #cervantes6 years ago

gopher wallpaper
Un par de publicaciones atrás me comprometí a realizar una exclusivamente de punteros, es momento de cumplir con ese compromiso y abordar este tema que, en su momento, me generó algunos dolores de cabeza

Punteros

Un puntero referencia a una ubicación en memoria, y a la obtención del valor almacenado en esa ubicación se la conoce como desreferenciación del puntero. A modo de analogía, un número de página en el índice de un libro podría considerarse un puntero a la página correspondiente; desreferenciar un puntero sería como ir a la página con el número de página especificada en el índice.
Fuente: Wikipedia

En resumen, un puntero almacena una dirección en memoria de un valor. Un puntero es simplemente otro tipo de dato en Go, como los otros que conocemos tiene su lugar y su momento, cuando los entiendes son realmente muy útiles. Debo confesar que me costó un poco entender los punteros, se lo atribuyo a mi background (Python, JavaScript) en el que no había tenido la necesidad que trabajar con ellos; si ustedes vienen de lenguajes como C es muy posible que les resulte familiar, aunque para su gusto o disgusto, Go no cuenta con aritmética de punteros. Vamos con los ejemplos.

var numero int
var puntero *int // Puntero a un int

numero = 10
puntero = &numero

fmt.Println("numero:", numero)   // numero: 10
fmt.Println("puntero:", puntero) // puntero: 0x19f100c0



En primer lugar tenemos la variable número que es de tipo int, seguida de una variable que en mi característico derroche de creatividad llamé puntero, la cual es de tipo puntero a un int, si comparan ambas declaraciones notarán que la diferencia radica en el asterisco que se antepone al tipo int, sí, eso es todo lo que se necesita para declarar un puntero. Posteriormente asignamos valores a ambas variables y, en el caso de puntero, empleamos otro carácter extraño, el &, con este indicamos que no queremos que la variable puntero almacene el valor de la variable numero sino su dirección en memoria. Esto debería quedar más claro después de ver las respectivas salidas de las impresiones de ambas variables.

Es importante tener en cuenta que: El valor cero de una variable puntero es nil, que el valor de salida al imprimir el puntero puede variar en cada ejecución del programa, que los punteros sólo pueden almacenar direcciones en memoria del tipo de datos establecido y que también podemos declararlos utilizando la función new, por ejemplo, x := new(int) es equivalente a x := *int. Ahora que conocemos los básico sobre un puntero veamos como utilizarlos.

package main

import "fmt"

func duplicar(n int) int {
    n = n * 2
    return n
}

func main() {
    numero := 10

    fmt.Println("Duplicando numero:", duplicar(numero)) // Duplicando numero: 20

    fmt.Println("Después de duplicar:", numero) // Después de duplicar: 10
}



El código es bastante sencillo, creamos una función llamada duplicar que recibe un número entero, multiplica su valor por dos y retorna dicho valor. Dentro de la función main creamos una variable numero de tipo int que almacena el valor 10; imprimimos el resultado de pasar la variable numero como argumento a la función duplicar y el resultado es el esperado. Pero al momento de imprimir numero notamos que su valor no ha cambiado. El hecho es que Go pasa las variables a las funciones por valor y no por referencia, si queremos que los cambios en la función afecten a la variable en cuestión debemos hacer uso de punteros. Vamos a retomar el ejemplo anterior.

package main

import "fmt"

func duplicar(n *int) int {
    *n = *n * 2 // Otra manera sería: *n *= 2
    return *n
}

func main() {
    numero := 10

    fmt.Println("Duplicando numero:", duplicar(&numero)) // Duplicando numero: 20

    fmt.Println("Después de duplicar:", numero) // Después de duplicar: 20
}



Que no los intimide el montón de asteriscos, realmente es bastante sencillo, aún más con lo versión opcional que pueden ver comentada dentro de la función duplicar, es decir *n *= 2. Al pasar el argumento n a la función duplicar no como un número entero sino como un puntero a un número entero, tenemos acceso a su dirección en memoria, el asterisco que anteponenos a la variable n indica que queremos acceder al valor almacenado en esa dirección, de esta forma somos capaces de acceder al valor de la variable numero y modificarlo. Veamos otro ejemplo.

numero := 10
puntero := &numero

fmt.Println("Dirección", puntero)  // Dirección 0x186100c0

fmt.Println("Valor:", *puntero)     // Valor: 10

// Modificando valor a través del puntero

*puntero++                                                 // Equivalente a: numero = numero + 1
fmt.Println("Valor de numero:", numero)  // Valor de numero: 11



Espero que con esta explicación pudieran entender como funcionan los punteros en Go. De cualquier forma los invito a realizar pruebas por su cuenta y compartir sus dudas y experiencias. Los punteros son de gran utilidad, los continuaremos viendo y utilizando en el futuro.

separator.png

Publicaciones relacionadas

  1. De Python a Go (Golang)

  2. Introducción al lenguaje de programación Go (Golang)

  3. Estructuras de control de flujo en Go

  4. Array y Slice en Go (Golang)

  5. Maps en Go (Golang)

Gracias por leer, espero que este articulo te resultara de provecho. Si así fue, no dudes en dejar un comentario, compartirlo y votar. Te invito a comentar cualquier duda o sugerencia, te aseguro que las leo todas. Así que, por favor, ayúdame a mejorar y continuar compartiendo contenido de calidad. Hasta la próxima.

banner-steemit.jpg

Sort:  

Hello! Your post has been resteemed and upvoted by @ilovecoding because we love coding! Keep up good work! Consider upvoting this comment to support the @ilovecoding and increase your future rewards! ^_^ Steem On!

Reply !stop to disable the comment. Thanks!

Muy buena tu explicación sobre los punteros y como dices para aquellos que vienen de lenguajes de programación como lo es C/C++ se les hara muy sencillo poderlos usar

Este post fue votado por la comunidad y trail @developspanish, comunidad encargada de curar a los programadores, traductores de software y bloggers de informática y tecnología de habla hispana.

¿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

Gracias. Siendo un tema que al inicio me costó dominar, quería aportar una explicación sencilla y práctica. Me parece del tipo de cosas que es más complicadas de entender en teoría que en la practica.

Congratulations @orlmicron! You have completed the following achievement on the Steem blockchain and have been rewarded with new badge(s) :

Award for the number of upvotes received

Click on the badge to view your Board of Honor.
If you no longer want to receive notifications, reply to this comment with the word STOP

Support SteemitBoard's project! Vote for its witness and get one more award!

Coin Marketplace

STEEM 0.26
TRX 0.25
JST 0.040
BTC 92903.81
ETH 3331.70
USDT 1.00
SBD 3.29