5
respostas

Ao tentar monitorar sites, no final recebo Get "": unsupported protocol scheme ""

Na aplicação que estou construindo ao longo do curso, onde monitoramos sites atraves do pacote http/net do golang, nos é sugerido a adição dos sites que queremos monitorar em um arquivo txt a parte e retornar os sites em um array.

func readsitesfile() []string {
    var sites []string
    file, _ := os.Open("sites.txt")
    reader := bufio.NewReader(file)
    for {
        line, err := reader.ReadString('\n')
        regex, _ := regexp.Compile("\n\n")
        line = regex.ReplaceAllString(line, "\n")
        line = strings.TrimSpace(line)
        sites = append(sites, line)
        if err == io.EOF {
            break
        }
    }
    file.Close()
    return sites
}

Porém ao executar o codigo que inicia o monitoramento, após o ultimo site o golang me retornar um erro:

An error ocurred:  Get "": unsupported protocol scheme ""
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x2 addr=0x10 pc=0x100b93eb0]

Eu acredito que seja porque meu visual studio está configurado para sempre acrescentar uma linha em branco no final dos arquivos ao salva-los e o go tenta fazer um get com uma string vazia(""), porém ainda não encontrei solução caso seja esse o problema.

Versão do go que utilizo: go1.19

5 respostas

Ainda não encontrei solução mas fiz uma solução temporaria onde ignoro quando há algo vazio em uma string

func monitoring() {
    sites := readsitesfile()
    fmt.Println("Sites", sites)
    for i := 0; i < monitoring_times; i++ {
        for _, site := range sites {
            if site == "" {
                continue
            }
            checkSiteStatus(site)
        }
        fmt.Println("")
        time.Sleep(delay * time.Second)
    }
    fmt.Println("")
}

Tenta adicionar uma forma de tratar o erro:

O erro está na request GET, não na função de ler o arquivo. Pra evitar esse erro que você apresentou, acho que a melhor forma é tratar o err da request logo de cara e retornar alguma coisa, segue aí embaixo um exemplo que eu fiz. Ele imprime o err e retorna a string "Erro", mas você pode retornar qualquer coisa/adaptar da melhor forma pro exercício.

An error ocurred:  Get "": unsupported protocol scheme ""
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x2 addr=0x10 pc=0x100b93eb0]

Isso é um erro irrecuperável, fazendo da forma abaixo, você consegue seguir o problema e apenas imprimir o erro que ocorreu.

An error ocurred: Get "": unsupported protocol scheme ""

func testaSite(site string) string{
    response, err := http.Get(site)

    if err != nil {
        fmt.Println("", err)
        return "Erro"
    }
    
    if response.StatusCode == 200 {
        fmt.Println("",site)
        fmt.Println("Site: ", site)
        fmt.Println("Status Code: ", response.StatusCode)
        return site
    } else {
        fmt.Println("Site: ", site)
        fmt.Println("Erro, Status Code; ", response.StatusCode)
        return site
    }
}

Sim, até comecei a tratar o erro, mas eu queria uma forma no golang de sempre verificar uma linha em branco do arquivo e remove-lá. O erro ocorre por conta dos dados que ele retorna do arquivo, que sao 4 linhas, sendo a ultima linha não tendo dado algum, então o ultimo elemento do array fica como ""e ele tenta dar um get "". É importante realmente tratar o erro pois pode haver imprevistos mas queria também garantir a leitura do arquivo sem linhas em brancos, pois imagina um arquivo mal formatado tendo 20 linhas vazias, em um projeto de leitura dos dados e requisição, vai tentar fazer 20 requisiçoes inuteis

Sim, nesse caso dentro da própria função de ler arquivos você limpar as linhas vazias. Achei que tivesse agarrado na hora de tratar o err.

Eu resolvi esse lance das linhas vazias dessa forma, ele não adiciona no slice sites se a len(line) for 0.

func readSitesFile() []string { var sites []string file, err := os.Open("sites.txt") //file, err := ioutil.ReadFile("sites.txt")

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

leitor := bufio.NewReader(file)

for {
    line, err := leitor.ReadString('\n')
    line = strings.TrimSpace(line)
    fmt.Println(line)

    if len(line) != 0 {
        sites = append(sites, line)
    }
    
    if err == io.EOF {
        break
    }
}
file.Close()

return sites   

}