Ir - Punteros

Los punteros en Go son fáciles y divertidos de aprender. Algunas tareas de programación de Go se realizan más fácilmente con punteros y otras tareas, como la llamada por referencia, no se pueden realizar sin usar punteros. Por lo tanto, es necesario aprender los consejos para convertirse en un programador perfecto de Go.

Como sabe, cada variable es una ubicación de memoria y cada ubicación de memoria tiene su dirección definida a la que se puede acceder usando el operador y comercial (&), que denota una dirección en la memoria. Considere el siguiente ejemplo, que imprimirá la dirección de las variables definidas:

package main

import "fmt"

func main() {
   var a int = 10   
   fmt.Printf("Address of a variable: %x\n", &a  )
}

Cuando el código anterior se compila y ejecuta, produce el siguiente resultado:

Address of a variable: 10328000

Entonces entendiste qué es la dirección de memoria y cómo acceder a ella. Ahora veamos qué son los indicadores.

¿Qué son los punteros?

UN pointeres una variable cuyo valor es la dirección de otra variable, es decir, la dirección directa de la ubicación de la memoria. Como cualquier variable o constante, debe declarar un puntero antes de poder usarlo para almacenar cualquier dirección de variable. La forma general de una declaración de variable de puntero es:

var var_name *var-type

Aquí, typees el tipo base del puntero; debe ser un tipo de datos C válido yvar-namees el nombre de la variable de puntero. El asterisco * que usó para declarar un puntero es el mismo asterisco que usa para la multiplicación. Sin embargo, en esta declaración, el asterisco se utiliza para designar una variable como puntero. A continuación se muestra la declaración de puntero válida:

var ip *int        /* pointer to an integer */
var fp *float32    /* pointer to a float */

El tipo de datos real del valor de todos los punteros, ya sean enteros, flotantes u otros, es el mismo, un número hexadecimal largo que representa una dirección de memoria. La única diferencia entre punteros de diferentes tipos de datos es el tipo de datos de la variable o constante a la que apunta el puntero.

¿Cómo utilizar los punteros?

Hay algunas operaciones importantes, que frecuentemente realizamos con punteros: (a) definimos variables de puntero, (b) asignamos la dirección de una variable a un puntero y (c) accedemos al valor en la dirección almacenada en la variable de puntero .

Todas estas operaciones se realizan mediante el operador unario * que devuelve el valor de la variable ubicada en la dirección especificada por su operando. El siguiente ejemplo demuestra cómo realizar estas operaciones:

package main

import "fmt"

func main() {
   var a int = 20   /* actual variable declaration */
   var ip *int      /* pointer variable declaration */

   ip = &a  /* store address of a in pointer variable*/

   fmt.Printf("Address of a variable: %x\n", &a  )

   /* address stored in pointer variable */
   fmt.Printf("Address stored in ip variable: %x\n", ip )

   /* access the value using the pointer */
   fmt.Printf("Value of *ip variable: %d\n", *ip )
}

Cuando el código anterior se compila y ejecuta, produce el siguiente resultado:

Address of var variable: 10328000
Address stored in ip variable: 10328000
Value of *ip variable: 20

Punteros nulos en Go

Vaya al compilador a asignar un valor cero a una variable de puntero en caso de que no tenga una dirección exacta para asignar. Esto se hace en el momento de la declaración de la variable. Un puntero que se asigna nil se llama unnil puntero.

El puntero nulo es una constante con un valor de cero definido en varias bibliotecas estándar. Considere el siguiente programa:

package main

import "fmt"

func main() {
   var  ptr *int

   fmt.Printf("The value of ptr is : %x\n", ptr  )
}

Cuando el código anterior se compila y ejecuta, produce el siguiente resultado:

The value of ptr is 0

En la mayoría de los sistemas operativos, los programas no pueden acceder a la memoria en la dirección 0 porque esa memoria está reservada por el sistema operativo. Sin embargo, la dirección de memoria 0 tiene un significado especial; indica que el puntero no está destinado a apuntar a una ubicación de memoria accesible. Pero por convención, si un puntero contiene el valor nulo (cero), se supone que no apunta a nada.

Para verificar un puntero nulo, puede usar una declaración if de la siguiente manera:

if(ptr != nil)     /* succeeds if p is not nil */
if(ptr == nil)    /* succeeds if p is null */

Ir a punteros en detalle

Los punteros tienen muchos conceptos, pero fáciles, y son muy importantes para la programación de Go. Los siguientes conceptos de punteros deben ser claros para un programador de Go:

No Señor Concepto y descripción
1 Ir - Matriz de punteros

Puede definir matrices para contener varios punteros.

2 Ir - Puntero a puntero

Go le permite tener un puntero en un puntero y así sucesivamente.

3 Pasar punteros a funciones en Go

Pasar un argumento por referencia o por dirección permite que la función llamada cambie el argumento pasado en la función que llama.