0Pricing
Go Academy · Lección

¿Qué son los punteros?

Operador de dirección, desreferenciación y punteros nil

¿Qué son los punteros? es una lección gratuita de Go Academy en CoddyKit. Esta es la lección 1 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Go Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Go Academy incluye 4 lecciones en total.

Direcciones de memoria

Cada variable reside en una dirección de memoria. Un puntero almacena esa dirección. En Go, los punteros tienen tipo: un *int contiene la dirección de un int.

Operador de dirección &

Use & para obtener la dirección de una variable:

package main
import "fmt"

func main() {
    x := 42
    p := &x
    fmt.Println(p)  // 0xc000... (address)
    fmt.Println(*p) // 42 (value at address)
}

Desreferenciación *

Use * para leer o escribir el valor situado en la dirección del puntero:

package main
import "fmt"

func main() {
    n := 10
    p := &n
    *p = 99
    fmt.Println(n) // 99
}

Punteros nil

El valor cero de un puntero es nil. Desreferenciar un puntero nil provoca un panic:

package main
import "fmt"

func main() {
    var p *int
    fmt.Println(p)        // <nil>
    fmt.Println(p == nil) // true
    // *p = 1 — PANIC
}

Tipos de puntero

Cada tipo de puntero es específico del elemento al que apunta:

package main
import "fmt"

func main() {
    i := 1
    s := "hello"
    pi := &i   // *int
    ps := &s   // *string
    fmt.Printf("%T %T\n", pi, ps) // *int *string
}

Comprobar nil antes de usarlo

Compruebe siempre si es nil antes de desreferenciar un puntero recibido desde fuera de su código:

package main
import "fmt"

func printInt(p *int) {
    if p == nil {
        fmt.Println("nil pointer")
        return
    }
    fmt.Println(*p)
}

func main() {
    v := 7
    printInt(&v)
    printInt(nil)
}

Punteros a structs

Para acceder a los campos de un struct mediante un puntero se usa la misma notación de punto; Go desreferencia automáticamente:

package main
import "fmt"

type Point struct{ X, Y int }

func main() {
    p := &Point{1, 2}
    p.X = 10         // same as (*p).X = 10
    fmt.Println(*p)  // {10 2}
}

Comparación de punteros

Dos punteros son iguales cuando apuntan a la misma variable (la misma dirección) o cuando ambos son nil:

package main
import "fmt"

func main() {
    a := 1
    p1 := &a
    p2 := &a
    p3 := new(int)
    *p3 = 1
    fmt.Println(p1 == p2) // true  — same address
    fmt.Println(p1 == p3) // false — different address
}

Pila frente a heap

El compilador de Go decide si una variable reside en la pila o en el heap mediante el análisis de escape. Cuando obtiene la dirección de una variable local y la devuelve, Go la mueve automáticamente al heap; no tiene que gestionarlo manualmente.

Cuándo NO usar punteros

No todo necesita un puntero:

  • Los tipos pequeños por valor (int, bool y structs pequeños) son más baratos de copiar que de desreferenciar
  • Los datos inmutables compartidos entre goroutines son seguros como valores
  • Use punteros principalmente para modificar datos o trabajar con structs grandes

Comprobación rápida

¿Qué devuelve el operador &?

Recapitulación: punteros

Conclusiones principales:

  • &v obtiene la dirección; *p la desreferencia
  • El valor cero es nil; compruébelo siempre antes de desreferenciar
  • Go desreferencia automáticamente los punteros al acceder a campos de structs
  • El análisis de escape gestiona automáticamente la pila y el heap

Ejercicio práctico

Escriba una función swap(a, b *int) que intercambie los valores de dos enteros mediante punteros. Llámela desde main y muestre los valores anteriores y posteriores.

Preguntas frecuentes

¿La lección «¿Qué son los punteros?» es gratis?

Sí — el texto completo de «¿Qué son los punteros?» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Go Academy, actualiza a CoddyKit PRO. El curso de Go Academy incluye 4 lecciones en total.

¿Qué aprenderé en «¿Qué son los punteros?»?

Operador de dirección, desreferenciación y punteros nil Practicas Go Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Go Academy?

No se requiere experiencia previa. Go Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 1 de 4.

¿Cuánto tiempo toma la lección «¿Qué son los punteros?»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Go Academy?

Sí. Cada lección de Go Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. ¿Qué son los punteros?
  2. Punteros y funciones
  3. Receivers por puntero en métodos
  4. new() y cuándo usar punteros
← Volver a Go Academy