Comprensión de Punteros en Golang

GolangGolangBeginner
Practicar Ahora

This tutorial is from open-source community. Access the source code

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

Esta práctica te ayudará a comprender los punteros en Golang. Los punteros se utilizan para pasar referencias a valores y registros dentro de tu programa.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL go(("Golang")) -.-> go/DataTypesandStructuresGroup(["Data Types and Structures"]) go/DataTypesandStructuresGroup -.-> go/pointers("Pointers") subgraph Lab Skills go/pointers -.-> lab-15494{{"Comprensión de Punteros en Golang"}} end

Punteros

El problema consiste en comprender cómo funcionan los punteros en contraste con los valores mediante dos funciones: zeroval y zeroptr. zeroval tiene un parámetro de tipo int, por lo que los argumentos se pasarán a ella por valor. zeroval obtendrá una copia de ival distinta de la que existe en la función llamante. En contraste, zeroptr tiene un parámetro de tipo *int, lo que significa que acepta un puntero a int. El código *iptr en el cuerpo de la función luego desreferencia el puntero desde su dirección de memoria hasta el valor actual en esa dirección. Asignar un valor a un puntero desreferenciado cambia el valor en la dirección de memoria referenciada.

  • Deberías tener un conocimiento básico de Golang.
  • Deberías saber cómo definir y usar funciones en Golang.
  • Deberías saber cómo usar punteros en Golang.
## `zeroval` no cambia la variable `i` en `main`, pero
## `zeroptr` sí lo hace porque tiene una referencia a
## la dirección de memoria de esa variable.
$ go run pointers.go
inicial: 1
zeroval: 1
zeroptr: 0
puntero: 0x42131100

A continuación se muestra el código completo:

// Go admite <em><a href="https://en.wikipedia.org/wiki/Pointer_(computer_programming)">punteros</a></em>,
// lo que te permite pasar referencias a valores y registros
// dentro de tu programa.

package main

import "fmt"

// Mostraremos cómo funcionan los punteros en contraste con los valores con
// 2 funciones: `zeroval` y `zeroptr`. `zeroval` tiene un
// parámetro de tipo `int`, por lo que los argumentos se pasarán a ella por
// valor. `zeroval` obtendrá una copia de `ival` distinta
// de la que existe en la función llamante.
func zeroval(ival int) {
	ival = 0
}

// En contraste, `zeroptr` tiene un parámetro de tipo `*int`, lo que significa
// que acepta un puntero a `int`. El código `*iptr` en el
// cuerpo de la función luego _desreferencia_ el puntero desde su
// dirección de memoria hasta el valor actual en esa dirección.
// Asignar un valor a un puntero desreferenciado cambia el
// valor en la dirección de memoria referenciada.
func zeroptr(iptr *int) {
	*iptr = 0
}

func main() {
	i := 1
	fmt.Println("inicial:", i)

	zeroval(i)
	fmt.Println("zeroval:", i)

	// La sintaxis `&i` devuelve la dirección de memoria de `i`,
	// es decir, un puntero a `i`.
	zeroptr(&i)
	fmt.Println("zeroptr:", i)

	// Los punteros también se pueden imprimir.
	fmt.Println("puntero:", &i)
}

Resumen

En esta práctica, aprendiste cómo usar punteros en Golang. También aprendiste la diferencia entre pasar valores y punteros a funciones.