viernes, 7 de diciembre de 2018

Punteros en Go

El concepto de punteros es heredado del lenguaje C, y es muy útil para determinados escenarios, tales como las funciones o las estructuras.

Una variable es un nombre que utilizamos para referirnos a un valor o dato. Dicho valor o dato se almacena en alguna posición de la memoria del ordenador.

Podemos conocer la dirección de memoria de una variable utilizando el operador de indirección & (ampersand):

var x int = 10
fmt.Println("x=", x)   // 10
fmt.Println("&x=", &x) // 0xc0000120b0

Un puntero es, básicamente, una variable que apunta a la dirección de memoria de otra variable. Por tanto, mediante un puntero podemos operar directamente sobre esa dirección de memoria y, por consiguiente, sobre el valor de la primera variable.

package main

import "fmt"

func main() {

   var x int = 10

   fmt.Println("x=", x)   // 10
   fmt.Println("&x apunta a ", &x) // 0xc0000120b0 

   // ptrx es un puntero que apunta a
   // la direccion de memoria de x
   ptrx := &x

   // Almacena en la direccion de memoria a
   // la que apunta ptrx el valor 15
   *ptrx = 15 // Idem a x=15

   fmt.Println("x=", x)   // 15

   fmt.Println("ptrx apunta a ", ptrx) // 0xc0000120b0
   fmt.Println("*ptrx vale ", *ptrx)   // 15
   fmt.Println("&x apunta a ", &x)     // 0xc0000120b0
}

El operador puntero * (asterisco), hace referencia a una dirección de memoria. Cuando se utiliza para asignar un valor, este valor es asignado a la dirección de memoria a la que apunta el puntero, que es la misma dirección de memoria que la variable direccionada mediante el operador de indirección. Es decir, no se asigna el valor a la variable, si no a la dirección de memoria.

Enlaces de interés

No hay comentarios:

Publicar un comentario