如果错误不是nil,为什么同时返回err和nil?

时间:2018-08-24 15:03:05

标签: go return-value

我正在关注golang wiki instruction,发现这令人困惑:

func loadPage(title string) (*Page, error) {
    filename := title + ".txt"
    body, err := ioutil.ReadFile(filename)
    if err != nil {
        return nil, err
    }
    return &Page{Title: title, Body: body}, nil
}

如果err不等于nil,为什么要返回nil?

不是吗?

if err != nil {
    return err
}

是否像golang errors and values中所述?

3 个答案:

答案 0 :(得分:5)

该函数返回两件事:一个页面(指针)和一个错误。如果发生错误,则没有页面要返回,因此返回的第一个值是nil。返回的第二个值是错误err

答案 1 :(得分:3)

在loadpage函数中,您将返回两个值,一个是指向Page的指针,另一个是错误。

func loadPage(title string) (*Page, error) {
    filename := title + ".txt"
    body, err := ioutil.ReadFile(filename)
    if err != nil {
        return nil, err
    }
    return &Page{Title: title, Body: body}, nil
}

这就是代码中有错误并且不等于nil的原因。然后返回错误。但是由于您需要返回Page,也应该为nil,因为它表示指针的值为零。这表明Page的值为空。

return &Page{Title: title, Body: body}, nil

但是如果没有错误,那么您将再次返回两个值,一个是Page struct的地址,其值分配给Page字段,但为零则表示错误。

如果类型的值不包含任何值。应该使用零值初始化,该值是

  

对于布尔值为false,对于数字类型为0,对于字符串为“”,对于字符串为nil   指针,函数,接口,切片,通道和映射。

一个或多个返回值可以在“ return”语句中明确列出。每个表达式必须是单值的,并且可以分配给函数结果类型的相应元素。

func complexF1() (re float64, im float64) {
    return -7.0, -4.0
}

“ return”语句中的表达式列表可以是对多值函数的单次调用。效果就像是将从该函数返回的每个值都分配给具有相应值类型的临时变量,然后是列出这些变量的“ return”语句,此时适用前一种情况的规则。

func complexF2() (re float64, im float64) {
    return complexF1()
}

注意:

  

无论如何声明,所有结果值都是   在输入时将其类型初始化为零值   功能。指定结果的“ return”语句设置结果   参数在执行任何延迟函数之前。

看看Return statements的Golang规范

答案 2 :(得分:1)

  

The Go Programming Language Specification

     

The zero value

     

当通过声明为变量分配存储空间时   或调用new或创建新值时(通过   复合文字或make的调用,并且没有显式初始化   如果提供,则变量或值被赋予默认值。每个元素   这样的变量或值的类型为其类型设置为零值:   对于布尔值,为false;对于数字类型,为0;对于字符串,为“”;对于布尔值,为nil   指针,函数,接口,切片,通道和映射。这个   初始化是递归完成的,因此例如   如果未指定值,则结构数组的字段将为零。


由于该错误,没有有效值要返回,因此我们返回零值,在这种情况下,它恰好是nil(对于指针值)。