为了账号安全,请及时绑定邮箱和手机立即绑定

在 Go 中,当一个函数返回错误时,其他变量是否总是它的“零”值?

在 Go 中,当一个函数返回错误时,其他变量是否总是它的“零”值?

Go
小唯快跑啊 2021-12-07 15:11:28
我说的是 Go 标准库:output, err := abc.Xyz()if err != nil {    // by convention is `output` always its "zero" value?}
查看完整描述

1 回答

?
富国沪深

TA贡献1790条经验 获得超9个赞

不总是。例如io.Reader

包io

类型阅读器

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

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

Read 将最多 len(p) 个字节读入 p。它返回读取的字节数 (0 <= n <= len(p)) 和遇到的任何错误。即使 Read 返回 n < len(p),它也可能在调用期间使用所有 p 作为暂存空间。如果某些数据可用但 len(p) 字节不可用,则 Read 通常会返回可用的数据,而不是等待更多数据。

当 Read 在成功读取 n > 0 个字节后遇到错误或文件结束条件时,它返回读取的字节数。它可能会从同一个调用中返回(非零)错误或从后续调用中返回错误(和 n == 0)。这种一般情况的一个实例是,在输入流末尾返回非零字节数的 Reader 可能返回 err == EOF 或 err == nil。下一个 Read 应该返回 0,EOF。

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

不鼓励 Read 的实现返回带有 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这样,除非文档另有说明,否则假定所有其他值都未定义。


查看完整回答
反对 回复 2021-12-07
  • 1 回答
  • 0 关注
  • 211 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信