Da trilha de Go Este conceito ainda não saiu como card do dia. ir para o card de hoje

Go Memória Básico

Ponteiros

Em Go, um ponteiro é uma variável que guarda o endereço de memória de outra variável. Com o operador & você obtém o endereço de uma variável, e com * você acessa o valor armazenado nesse endereço (desreferenciação). Ponteiros permitem compartilhar dados entre funções sem copiar grandes estruturas e modificar o valor original.

Ponteiros para structs são muito comuns: p := &Pessoa{...} cria um ponteiro para uma struct e p.Nome acessa o campo diretamente (Go faz a desreferenciação automática). A função new(T) aloca memória para um valor do tipo T e retorna um ponteiro *T já zerado.

Use ponteiros quando precisar modificar o valor original dentro de uma função, evitar cópias custosas de grandes structs ou indicar que um valor pode ser nil. Evite ponteiros para tipos pequenos e imutáveis, como int em operações simples, pois a indireção adiciona complexidade desnecessária.

Pontos-chave

  • &variavel retorna o endereço de memória (um ponteiro).
  • *ponteiro acessa o valor apontado (desreferenciação).
  • new(T) aloca um T zerado e devolve *T.
  • Ponteiros para struct permitem modificar campos sem copiar a struct.
  • Use ponteiros para modificar valores, evitar cópias grandes ou representar ausência (nil).
ponteiros.go
package main

import "fmt"

type Pessoa struct {
	Nome string
	Idade int
}

// aniversario recebe um ponteiro para modificar a Pessoa original.
func aniversario(p *Pessoa) {
	p.Idade++ // Go desreferencia automaticamente: (*p).Idade++
}

func main() {
	// Ponteiro para int
	n := 10
	ptr := &n       // & obtém o endereço
	fmt.Println(*ptr) // * acessa o valor: 10
	*ptr = 20       // modifica o valor original
	fmt.Println(n)  // 20

	// Ponteiro para struct
	p := Pessoa{"Ana", 30}
	aniversario(&p) // passa o endereço
	fmt.Println(p.Idade) // 31

	// new aloca um ponteiro para struct zerada
	q := new(Pessoa)
	q.Nome = "Bruno" // desreferenciação automática
	q.Idade = 25
	fmt.Println(*q) // {Bruno 25}
}

Exercícios

  1. 1
    Fácil

    Dobrar valor com ponteiro

    Escreva uma função dobrar que recebe um ponteiro para int e multiplica o valor apontado por 2. No main, crie uma variável x := 7, chame dobrar(&x) e imprima o novo valor de x.

    Resolver
  2. 2
    Médio

    Atualizar campo de struct via ponteiro

    Crie uma struct Conta com os campos Titular string e Saldo float64. Escreva um método Depositar(valor float64) com receptor ponteiro que soma valor ao saldo. No main, crie uma conta, deposite 100.50 e imprima o saldo formatado com duas casas decimais.

    Resolver
  3. 3
    Desafio

    Fila de pessoas com ponteiros e new

    Implemente uma fila simples de pessoas usando uma slice de ponteiros para a struct Pessoa (campos Nome e Idade). Crie funções adicionar(fila *[]*Pessoa, nome string, idade int) que usa new(Pessoa) para alocar e adiciona à fila, e aniversariar(fila []*Pessoa) que incrementa a idade de todas as pessoas. No main, adicione duas pessoas, chame aniversariar e imprima nome e idade de cada uma.

    Resolver

Continue estudando