我在谈论Go标准库:
output, err := abc.Xyz()
if err != nil {
// by convention is `output` always its "zero" value?
}
答案 0 :(得分:5)
并非总是如此。例如,io.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
,除非文档另有说明,否则假定所有其他值都未定义。