Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

[Bug] Não consigo realizar monitoria dos sites por 'panic: runtime error: invalid memory address or nil pointer dereference [signal SIGSEGV: segmentation violation code=0x1 addr=0x10 pc=0x629f00]'

Olá, estava seguindo a aula e ao tentar executar o script em Go para monitorar os sites, eu me deparei com o seguinte problema:

Monitorando...
Testando site 0 : www.globo.com
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x10 pc=0x629ef6]

goroutine 1 [running]:
main.testaSite({0xc00001a330, 0xd})
    /home/brunoteixeira/go/src/hello/hello.go:122 +0x56
main.iniciarMonitoramento()
    /home/brunoteixeira/go/src/hello/hello.go:99 +0x245
main.main()
    /home/brunoteixeira/go/src/hello/hello.go:32 +0xe5
exit status 2

Seguindo o track do erro, o problema teria sido causado nesse pedaço do código:

func testaSite(site string) {
    resp, err := http.Get(site)
    fmt.Println(resp.StatusCode)

    if err != nil {
        fmt.Println("Ocorreu um erro:", err)
    }

    if resp.StatusCode == 200 {
        fmt.Println("Site:", site, "foi carregado com sucesso!")
    } else {
        fmt.Println("Site:", site, "está com problema. Status Code:", resp.StatusCode)
    }
}

Mas enviarei as outras partes do código envolvidas no processo.

func iniciarMonitoramento() {
    fmt.Println("Monitorando...")
    sites := leSitesDoArquivo()
    for i := 0; i < monitoramentos; i++ {
        for i, site := range sites {
            fmt.Println("Testando site", i, ":", site)
            testaSite(site)
        }
        time.Sleep(delay * time.Second)
        fmt.Println("")
    }
    fmt.Println("")
}

func leSitesDoArquivo() []string {
    var sites []string
    arquivo, err := os.Open("sites.txt")
    if err != nil {
        fmt.Println("Ocorreu um erro:", err)
    }
    leitor := bufio.NewReader(arquivo)

    for {
        linha, err := leitor.ReadString('\n')
        linha = strings.TrimSpace(linha)
        sites = append(sites, linha)
        if err == io.EOF {
            break
        }
    }
    return sites
}
2 respostas
solução!

Parece que o problema está na linha resp, err := http.Get(site). Quando ocorre o erro err, o valor de resp é nulo (nil), então quando tentamos acessar resp.StatusCode na linha seguinte, estamos tentando acessar um campo de um ponteiro nulo, o que causa a exceção "invalid memory address or nil pointer dereference".

Para corrigir, basta adicionar um tratamento de erro para quando err for diferente de nil, como por exemplo:

if err != nil {
    fmt.Println("Ocorreu um erro:", err)
    return
}

Isso fará com que a função testaSite retorne imediatamente quando houver um erro, evitando o acesso ao ponteiro nulo.

Fiz o que você disse, e me ajudou a achar o problema que estava causando tudo, que era esse erro :UnSupported Protocol scheme Tudo porque meus sites não possuíam https:// antes do www, então foi só adicionar o https:// que resolveu, valeu pela ajuda, Diogo!