Golang函数中test.go第25行报错:缺失return语句的原因是什么?

Golang函数中test.go第25行报错:缺失return语句的原因是什么? 以下是我的代码

package main

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

func getbalance(address string) string {
  response, err := http.Get("https://blockchain.info/q/addressbalance/" + address)
  if err != nil {
      fmt.Printf("%s", err)
      os.Exit(1)
  } else {
      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)
  }
}


func main() {
  finalB := getbalance("1A63imbiQBtsnTqtUpuUT5WL2Ti7oKNLeg")
  fmt.Printf("Final Balance: %s", finalB)
}

返回错误:.\test.go:25:1: 函数末尾缺少返回语句 为什么?


更多关于Golang函数中test.go第25行报错:缺失return语句的原因是什么?的实战教程也可以访问 https://www.itying.com/category-94-b0.html

3 回复

非常感谢,我查看了你的代码以便理解。

更多关于Golang函数中test.go第25行报错:缺失return语句的原因是什么?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


getbalance 函数缺少一个最终的 return 语句。

目前编译器认为,在 err != nil 的情况下,您没有 return 任何内容,因为它无法看透 os.Exit() 的行为。

一个更合理的解决方案可能是去掉 else 分支,而是保持“内联”处理:

func getbalance(address string) string {
  response, err := http.Get("https://blockchain.info/q/addressbalance/" + address)
  if err != nil {
      fmt.Printf("%s", err)
      os.Exit(1)
  }
  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)
}

这个错误是因为你的 getbalance 函数没有在所有代码路径上都返回 string 值。当 err != nil 时,函数执行了 os.Exit(1) 但没有返回字符串。

在 Go 中,如果函数声明了返回值类型,那么所有可能的执行路径都必须返回该类型的值。os.Exit(1) 会终止程序,但编译器仍然要求函数有返回语句。

以下是修复后的代码:

package main

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

func getbalance(address string) string {
    response, err := http.Get("https://blockchain.info/q/addressbalance/" + address)
    if err != nil {
        fmt.Printf("%s", err)
        os.Exit(1)
        return "" // 这行代码实际上不会执行,但满足了编译器的要求
    }
    
    defer response.Body.Close()
    contents, err := ioutil.ReadAll(response.Body)
    if err != nil {
        fmt.Printf("%s", err)
        os.Exit(1)
        return "" // 这行代码实际上不会执行,但满足了编译器的要求
    }
    
    fmt.Printf("%s\n", string(contents))
    return string(contents)
}

func main() {
    finalB := getbalance("1A63imbiQBtsnTqtUpuUT5WL2Ti7oKNLeg")
    fmt.Printf("Final Balance: %s", finalB)
}

更好的做法是返回错误而不是直接退出程序:

package main

import (
    "fmt"
    "io/ioutil"
    "net/http"
)

func getbalance(address string) (string, error) {
    response, err := http.Get("https://blockchain.info/q/addressbalance/" + address)
    if err != nil {
        return "", err
    }
    
    defer response.Body.Close()
    contents, err := ioutil.ReadAll(response.Body)
    if err != nil {
        return "", err
    }
    
    fmt.Printf("%s\n", string(contents))
    return string(contents), nil
}

func main() {
    finalB, err := getbalance("1A63imbiQBtsnTqtUpuUT5WL2Ti7oKNLeg")
    if err != nil {
        fmt.Printf("Error: %v\n", err)
        return
    }
    fmt.Printf("Final Balance: %s", finalB)
}
回到顶部