1
resposta

Golang fundamentos

package main

import (
    "fmt"
    "net/http"
    "os"
)

func main() {

    exibeIntroducao()

    for {

        menuDeOpcoes()

        comando := leComando()

        switch comando {
        case 1:
            iniciarMonitoramento()
        case 2:
            fmt.Println("Exibendo Logs do Sistema ...")
        case 0:
            fmt.Println("Sessão encerrada.")
            os.Exit(0)
        default:
            fmt.Println("Comando não é reconhecido pelo sistema")
            os.Exit(-1)
        }
    }

}

func exibeIntroducao() {
    nome := "Márcio Xavier Ramos"
    versao := 1.1
    fmt.Println("Olá Sr.", nome)
    fmt.Println("Versão do Programa:", versao)
}

func menuDeOpcoes() {
    fmt.Println("O que você quer fazer?")
    fmt.Println("1- Iniciar Monitoramento.")
    fmt.Println("2- Exibir Logs.")
    fmt.Println("0- Sair")
}

func leComando() int {
    var comando int
    _, err := fmt.Scanf("%d", &comando)
    if err != nil {
        fmt.Println("Erro ao ler comando. Por favor, insira um número válido.")
        os.Exit(1)
    }

    return comando
}

func iniciarMonitoramento() {
    fmt.Println("Monitorando ...")
    site := "https://roadmap.sh/golang"
    resp, err := http.Get(site)

    if err != nil {
        fmt.Println("Erro ao retornar o site", err)
        os.Exit(1)
    }

    defer resp.Body.Close()

    if resp.StatusCode == 200 {
        fmt.Println("O site", site, "foi carregado corretamente")
    } else {
        fmt.Println("O site", site, "retornou", resp.StatusCode)
    }

}

Quando uso o (for) ele nesta versão do exercício ela não da o lupe como esperado, mas retorna a mensagem da função iniciarMonitoramento, resolvi o problema, mas gostaria de saber por que isso acontece: A mensegem que ele retorna esta é esta.

if err != nil {
        fmt.Println("Erro ao retornar o site", err)
        os.Exit(1)
    }

desta parte do código que esta dentro da função iniciarMonitoramento e o loop não processe, o programa é encerrado. mas quando não uso o (for ) o programa segue como esperado.

1 resposta

Olá Márcio! Tudo joia?

O problema que você está enfrentando parece estar relacionado ao comportamento do loop for e ao uso da função os.Exit dentro da função iniciarMonitoramento.

Quando você chama os.Exit(1) dentro da função iniciarMonitoramento, o programa é encerrado imediatamente, e é por isso que o loop for não continua. O os.Exit termina o programa de forma abrupta, e qualquer código após essa chamada não será executado.

Vamos analisar o trecho específico do seu código:

func iniciarMonitoramento() {
    fmt.Println("Monitorando ...")
    site := "https://roadmap.sh/golang"
    resp, err := http.Get(site)

    if err != nil {
        fmt.Println("Erro ao retornar o site", err)
        os.Exit(1)
    }

    defer resp.Body.Close()

    if resp.StatusCode == 200 {
        fmt.Println("O site", site, "foi carregado corretamente")
    } else {
        fmt.Println("O site", site, "retornou", resp.StatusCode)
    }
}

Se ocorrer um erro ao tentar acessar o site (http.Get(site)), o programa chama os.Exit(1), encerrando o programa. Isso faz com que o loop for não prossiga.

Para evitar que o programa seja encerrado e permitir que o loop continue, você pode modificar a função iniciarMonitoramento para tratar o erro de forma diferente. Por exemplo, você pode apenas imprimir a mensagem de erro e retornar da função, permitindo que o loop continue:

func iniciarMonitoramento() {
    fmt.Println("Monitorando ...")
    site := "https://roadmap.sh/golang"
    resp, err := http.Get(site)

    if err != nil {
        fmt.Println("Erro ao retornar o site", err)
        return // Apenas retorna da função, sem encerrar o programa
    }

    defer resp.Body.Close()

    if resp.StatusCode == 200 {
        fmt.Println("O site", site, "foi carregado corretamente")
    } else {
        fmt.Println("O site", site, "retornou", resp.StatusCode)
    }
}

Com essa modificação, se ocorrer um erro ao acessar o site, a função iniciarMonitoramento apenas imprime a mensagem de erro e retorna, permitindo que o loop for continue executando.

Espero ter ajudado e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.