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
- Visibilidad de datos y funciones en Go: https://territoriogo.blogspot.com/2018/10/visibilidad-de-datos-y-metodos-en-go.html
- A tour of Go - Pointers: https://tour.golang.org/moretypes/1
- Golang ebook - Pointers: https://www.golang-book.com/books/intro/8
- Go by Example - Pointers: https://gobyexample.com/pointers