Golang:在文本文件中发送查询时“函数结束时缺少返回”

Posted

技术标签:

【中文标题】Golang:在文本文件中发送查询时“函数结束时缺少返回”【英文标题】:Golang: "missing return at end of function" when sending queries for item in text file 【发布时间】:2022-01-12 21:21:52 【问题描述】:

我有这段代码,我在文本文件中的每行发送获取请求。但是,当我尝试运行代码时,我收到一条错误消息,提示“函数结束时缺少返回”。我知道这很可能是因为我在最后一个括号之前返回它,但我需要该括号内的代码,因为它定义了行、请求和正文内容。

我的代码:

// Routine
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 
    // For name in names.txt
    wordlist, err := readLines("assets/names.txt")
    if err != nil 
        log.Fatalf("readLines: %s", err)
    
    for _, line := range wordlist 
        // Send request
        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) 
    

【问题讨论】:

错误是因为没有返回,所以你必须添加一个返回(或恐慌,但这在这里更没有意义)。除非您只需要从文件中读取第一行,否则您如何期望从循环中提前返回以工作? 【参考方案1】:

根据Go Programming Language Specification

如果函数的signature声明了结果参数,函数体的语句列表必须以terminating statement结尾。

为了帮助解释问题,我们可以simplify your code 至:

package main

import "fmt"

func main() 
    fmt.Println(request([]string"foo"))


func request(wordlist []string) string 
    for _, line := range wordlist 
        // Do something
        return line
    

错误可以通过adding a return after the loop修复:

package main

import "fmt"

func main() 
    fmt.Println(request([]string"foo"))


func request(wordlist []string) string 
    for _, line := range wordlist 
        // Do something
        return line
    
    return ""

之所以需要额外的return,是因为函数可以传递一个空切片。在这种情况下,for 中的代码永远不会执行,这意味着没有终止语句(请注意,您可以将return 替换为panic)。如果readLines 返回一个空切片,这同样适用于您的代码。

我认为值得注意的是,在这里使用循环没有多大意义,因为您似乎只对第一个值感兴趣。您可以使用something like 获得相同的结果:

package main

import "fmt"

func main() 
    fmt.Println(request([]string"foo", "boo"))
    fmt.Println(request(nil))


func request(wordlist []string) string 
    if len(wordlist) == 0 
        return "No Data"
    

    line := wordlist[0]
    // do something...
    return line

我怀疑您实际上想要处理所有行,但不幸的是,您的问题没有提供足够的上下文来进一步提供帮助。

【讨论】:

【参考方案2】:

您的函数想要查找文本。 所以在那个循环中: 找到后跳出循环, 然后返回值。 (我把它最小化了一点)

    result := ""
    for _, line := range wordlist 
        if found 
            result = yourAnswer
            break
        
    
    return result


【讨论】:

以上是关于Golang:在文本文件中发送查询时“函数结束时缺少返回”的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 golang 在网络打印机上打印文件或格式化文本

golang zaplog使用(转)

Golang fsnotify 在 Windows 上为同一个文件发送多个事件

使用 mysql 驱动程序在 golang 中使用参数执行查询时出错

Golang 编译时发送到零通道 [关闭]

Golang:无法在恢复()中向通道发送错误