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!
- Crie o arquivo
matrix_ponteiros.gona pastasrc/:
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
- Abra o terminal integrado.
- 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)
}