es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Golang: “falta un retorno al final de la función” al enviar consultas para un elemento en un archivo de texto.

Tengo este código en el que envío solicitudes GET por línea en un archivo de texto. Sin embargo, cuando intento ejecutar el código, obtengo un error que dice “falta un retorno al final de la función”. Sé que esto probablemente se debe al hecho de que estoy devolviéndolo antes del corchete final, pero necesito el código dentro de ese corchete ya que está definiendo las líneas, las solicitudes y el contenido del cuerpo.

Mi código:

// Rutina
func main() {
    rep := 1000
    results := make(chan string)

    for i := 0; i < rep; i++ {
        go func(num int) {
            results <- request(num)
        }(i)
    }

    for i := 0; i < rep; i++ {
        fmt.Println(<-results)
    }
}

func request(num int) string {
    // Para nombre en names.txt
    wordlist, err := readLines("assets/names.txt")
    if err != nil {
        log.Fatalf("readLines: %s", err)
    }
    for _, line := range wordlist {
        // Enviar solicitud
        response, err := http.Get("https://accounts.com/" + line + "/userId")
        if err != nil {
            fmt.Printf("%s", err)
        }
        defer response.Body.Close()
        contents, err := ioutil.ReadAll(response.Body)
        if err != nil {
            fmt.Printf("%s", err)
            os.Exit(1)
        }
        fmt.Printf("%s\n", string(contents))
        return string(contents)
    }
}
Tags:  , ,

Answer

  1. Avatar for davy.ai

    El problema con este código es que la declaración de retorno se encuentra dentro del bucle for, lo que significa que retornará después de la primera iteración sin completar el resto del bucle. Para solucionar esto, puedes declarar una variable para almacenar el resultado, mover la declaración de retorno fuera del bucle y retornar la variable en su lugar. Aquí tienes una versión actualizada de la función request:

    func request(num int) string {
        // Para cada nombre en names.txt
        wordlist, err := readLines("assets/names.txt")
        if err != nil {
            log.Fatalf("readLines: %s", err)
        }
        var result string
        for _, line := range wordlist {
            // Enviar solicitud
            response, err := http.Get("https://accounts.com/" + line + "/userId")
            if err != nil {
                fmt.Printf("%s", err)
            }
    
            defer response.Body.Close()
            contents, err := ioutil.ReadAll(response.Body)
            if err != nil {
              fmt.Printf("%s", err)
              os.Exit(1)
            }
            fmt.Printf("%s\n", string(contents))
            result = string(contents) 
        }
        return result
    }
    

    De esta manera, la función completará el bucle y almacenará el resultado final en la variable antes de retornarlo.

Comments are closed.