为什么Go中的bufio在底层使用panic?

3

我在阅读bufio包的代码时,发现了以下内容:链接

// fill reads a new chunk into the buffer.
func (b *Reader) fill() {
    ...
    if b.w >= len(b.buf) {
        panic("bufio: tried to fill full buffer")
    }
    ...
}

同时,Effective Go 关于 panic章节中包含了以下段落:

这只是一个例子,但真正的库函数应该避免panic。如果问题可以被掩盖或解决,最好让事情继续运行而不是让整个程序崩溃。

因此,我想知道,标准库代码中的panic调用是否由特定缓冲读取器引起的问题如此重要?
1个回答

5

这可能存在争议,但请考虑: fill 是一个私有方法,b.wb.buf 是私有字段。如果导致 panic 的条件成立,则是在 bufio 的实现中存在逻辑错误。由于一开始不应该真正进入该状态(“不可能发生”的情况),因此我们实际上不知道如何到达那里,以及在问题被检测到之前有多少其他状态受到损坏,并且用户能够做什么,如果有的话。在这种情况下,触发 panic 似乎是合理的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接