在Go中,当函数返回错误时,其他变量是否始终为“零”值?

时间:2016-01-23 03:54:16

标签: go

我在谈论Go标准库:

output, err := abc.Xyz()
if err != nil {
    // by convention is `output` always its "zero" value?
}

1 个答案:

答案 0 :(得分:5)

并非总是如此。例如,io.Reader

  

Package io

     

type Reader

type Reader interface {
        Read(p []byte) (n int, err error)
}
     

Reader是包装基本Read方法的接口。

     

读取读取最多len(p)个字节到p。它返回字节数   读取(0< = n< = len(p))并遇到任何错误。即使阅读   返回n< len(p),它可以使用所有p作为临时空间   呼叫。如果某些数据可用但不是len(p)字节,则读取   通常会返回可用的内容,而不是等待更多内容。

     

Read之后遇到错误或文件结束条件   成功阅读n> 0字节,它返回读取的字节数。   它可能会从同一个调用返回(非零)错误或返回   来自后续调用的错误(和n == 0)。这个将军的一个例子   case是一个Reader在结尾返回非零字节数   输入流可以返回err == EOF或err == nil。该   next Read应返回0,EOF。

     

来电者应始终处理n>之前返回0个字节   考虑到错误错误。这样做可以正确处理I / O错误   在读取一些字节以及两个允许的EOF之后发生   的行为。

     

不鼓励读取的实现返回零字节   使用nil错误计数,除非len(p)== 0.来电者应该对待   返回0和nil表示没有发生任何事情;在   特别是它没有表明EOF。

     

实施不得保留p。

例如,

readfile.go

package main

import (
    "bufio"
    "fmt"
    "io"
    "os"
)

func main() {
    f, err := os.Open("readfile.go")
    if err != nil {
        fmt.Println(err)
        return
    }
    defer f.Close()
    r := bufio.NewReader(f)

    fileLen := int64(0)
    buf := make([]byte, 0, 4*1024)
    for {
        n, err := r.Read(buf[:cap(buf)])
        buf = buf[:n]
        if n == 0 {
            if err == nil {
                continue
            }
            if err == io.EOF {
                break
            }
            fmt.Println(err)
            return
        }

        // Do something with buf
        fileLen += int64(len(buf))

        if err != nil && err != io.EOF {
            fmt.Println(err)
            return
        }
    }
    fmt.Println("file length:", fileLen, "bytes")
}

如果err != nil,除非文档另有说明,否则假定所有其他值都未定义。