Eu entendo que ao não conseguir interpretar o input ele interpreta como zero e por isso sai do programa. O que não compreendo é porque que depois de eu fazer um input de 1, por exemplo, depois de executar o código, ele realizar um novo input que ele interpreta como 0. Segue código:
package main
import (
"bufio"
"fmt"
"io"
"io/ioutil"
"net/http"
"os"
"strconv"
"strings"
"time"
)
const monitoramentos = 3
const delay = 5
func main() {
exibeIntroducao()
leSitesDoArquivo()
for {
exibeMenu()
comando := leComando()
switch comando {
case 1:
iniciarMonitoramento()
case 2:
fmt.Println("Exibindo logs...")
imprimeLog()
case 0:
fmt.Println("Saindo do programa...")
os.Exit(0)
default:
fmt.Println("Não conheço este comando")
os.Exit(-1)
}
}
}
func exibeIntroducao() {
nome := "Gustavo"
versao := 1.2
fmt.Println("Olá, sr.", nome)
fmt.Println("Este programa está na versão", versao)
}
func exibeMenu() {
fmt.Println("1 - Iniciar monitoramento")
fmt.Println("2 - Exibir logs")
fmt.Println("0 - Sair do programa")
}
func leComando() int {
var comandoLido int
fmt.Scanf("%d", &comandoLido)
fmt.Println("O comando escolhido foi", comandoLido)
return comandoLido
}
func iniciarMonitoramento() {
fmt.Println("Monitorando...")
sites := leSitesDoArquivo()
for i := 0; i < monitoramentos; i++ {
for _, site := range sites {
testaSite(site)
}
fmt.Println("")
time.Sleep(delay * time.Second)
}
}
func testaSite(site string) {
resp, err := http.Get(site)
leSitesDoArquivo()
if err != nil {
fmt.Println("Ocorreu um erro:", err)
}
if resp.StatusCode == 200 {
fmt.Println("Site:", site, "foi carregado com sucesso!")
registraLog(site, true)
} else {
fmt.Println("Site:", site, "está com problemas. Status Code:", resp.StatusCode)
registraLog(site, false)
}
}
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
}
}
arquivo.Close()
return sites
}
func registraLog(site string, status bool) {
arquivo, err := os.OpenFile("log.txt", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
if err != nil {
fmt.Println("Ocorreu um erro:", err)
}
arquivo.WriteString(time.Now().Format("02/01/2006 15:04:05") + "-" + site + "-online: " + strconv.FormatBool(status) + "\n")
arquivo.Close()
}
func imprimeLog() {
arquivo, err := ioutil.ReadFile("log.txt")
if err != nil {
fmt.Println("Ocorreu um erro:", err)
}
fmt.Println(string(arquivo))
}
Eu alterei novamente na função do leComando() para poder testar, e segue com o mesmo problema. Só gostaria de entender o motivo de ao executar pela primeira vez funcionar, e aí, ao voltar para o menu, ele já colocar outro input sem eu digitar nada.