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

No hay comentarios:
Publicar un comentario