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标准库代码中的调用?

4

1 回答 1

5

这可能是有问题的,但请考虑:fill是私有方法,并且b.wb.buf是私有字段。如果导致恐慌的条件永远为真,那是由于 bufio 的实现中的逻辑错误。因为从一开始就不应该真正进入那个状态(“不可能发生”的情况),我们真的不知道我们是如何到达那里的,也不清楚在问题发生之前有多少其他状态被破坏被检测到,以及用户可以做些什么(如果有的话)。在那种情况下,恐慌似乎是合理的。

于 2016-04-26T05:20:18.147 回答