viernes, 7 de diciembre de 2018

Punteros en funciones en Go

Cuando trabajamos con funciones, los parámetros habituales reciben valores. En sí, los parámetros son variables definidas dentro del bloque de código de la función, por lo que su visibilidad y ámbito se refieren exclusivamente a la función (ver capítulo "Visibilidad de datos y funciones en go").

En el siguiente ejemplo, definimos la variable contador, con el valor 1. A continuación, llama la función incrementar(), enviando el valor de la variable contador. Esta función, recibe el valor y lo asigna al parámetro o variable valor. Ambas variables son diferentes, están definidas en diferentes bloques de código, apuntan a diferentes direcciones de memoria. La función, incrementa el valor de la variable valor, pero no afecta ni puede hacer nada con la variable contador.

package main

import "fmt"

func main() {
   var contador int = 1

   // llama a la funcion pasando el valor
   incrementar(contador) // 1
   fmt.Println("contador = ", contador)
}

// El parametro valor recibe el valor de contador
// valor apunta a una direccion de memoria distinta
// de contador. Por tanto, ambas variables
// apuntan a diferentes direcciones y son diferentes
func incrementar(valor int) {
   valor++ // Se asigna a la memoria de valor
}

En el siguiente ejemplo vamos a usar punteros:

package main

import "fmt"

func main() {
   var contador int = 1

   // llama a la funcion pasando la direccion
   // de memoria de la variable contador
   incr(&contador)
   fmt.Println("contador = ", contador) // 2
}

// El parametro valor es un puntero que recibe
// la direccion de memoria de la variable contador
func incr(valor *int) {
   // valor apunta a &contador
   // *valor asigna el valor a la direccion memoria
   *valor++ // Se asigna a la memoria de contador
}

En este caso, el parámetro de la función es un puntero, y recibe una dirección de memoria a la que referenciar. Cuando se llama a la función, se pasa la indirección de la variable contador. Por tanto, si el parámetro apunta a la dirección de memoria de la variable contador, las operaciones del puntero afectarán a dicha dirección de memoria, y, por tanto, también a la variable contador. En la función utilizamos el puntero para incrementar el valor actual, lo que se ve reflejado también en la variable contador.

Enlaces de interés

No hay comentarios:

Publicar un comentario