Capítulo 09: Ponteiros (Endereços de Memória) 🕶️💊

Neste capítulo, vamos aprender sobre os Ponteiros no Go. Eles nos permitem acessar diretamente o endereço de memória de uma variável, com o tema Matrix!


📖 O que são Ponteiros?

Um ponteiro é uma variável que guarda o endereço de memória de outra variável. Em vez de guardar o valor (como 42), ele guarda onde esse valor está guardado na memória do computador (como 0x140000a6018).

No Go, os ponteiros são muito mais seguros do que em C ou C++, pois o Go não permite fazer contas com endereços de memória (aritmética de ponteiros).


📖 Exemplo Guiado: O Endereço do Neo

Vamos usar o operador & para descobrir o endereço de memória de uma variável e o operador * para ver o valor que está lá dentro!

  1. Crie o arquivo matrix_ponteiros.go na pasta src/:
package main
 
import "fmt"
 
func main() {
    nome := "Thomas Anderson" // Variável normal
    
    // O operador '&' pega o endereço de memória da variável
    ponteiro := &nome 
 
    fmt.Println("Nome do civil:", nome)
    fmt.Println("Endereco na Matrix:", ponteiro) // Exibe algo como 0xc000010250
 
    // O operador '*' acessa o valor que está no endereço guardado pelo ponteiro
    fmt.Println("Valor no endereco:", *ponteiro)
 
    // Alterando o valor através do ponteiro!
    *ponteiro = "Neo"
 
    fmt.Println("Novo nome do civil:", nome)
}

🕹️ Como Executar e Testar no VS Code

  1. Abra o terminal integrado.
  2. Execute: go run matrix_ponteiros.go

Resultado Esperado:

Nome do civil: Thomas Anderson
Endereco na Matrix: 0xc000...
Valor no endereco: Thomas Anderson
Novo nome do civil: Neo

📊 Ilustração Visual: Apontando para a Memória

Veja como o ponteiro guarda a localização:

graph LR
    A["Ponteiro"] -->|"Guarda o endereço de"| B["Variável: nome"]
    B -->|"Guarda o valor"| C["'Thomas Anderson'"]

🛠️ Prática Obrigatória 1: Pílula Vermelha

Crie um programa chamado pilula_pointer.go que tenha uma variável cor com o valor “Azul”. Crie uma função chamada tomarPilulaVermelha(p *string) que receba o ponteiro da variável e mude o valor dela para “Vermelha”. Chame a função na main e exiba a cor da pílula antes e depois!


🔑 Gabarito de Código

Prática 1: pilula_pointer.go

package main
 
import "fmt"
 
func tomarPilulaVermelha(p *string) {
    *p = "Vermelha" // Muda o valor no endereço original!
}
 
func main() {
    cor := "Azul"
 
    fmt.Println("Cor original:", cor)
 
    // Passamos o endereço da variável usando '&'
    tomarPilulaVermelha(&cor)
 
    fmt.Println("Cor apos tomar a pilula:", cor)
}

Capitulo Anterior | Proximo Capitulo