首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >`bufio.Writer`还是`io.Writer`?

`bufio.Writer`还是`io.Writer`?
EN

Stack Overflow用户
提问于 2018-01-05 14:26:55
回答 1查看 1.7K关注 0票数 2

我有一个函数,它可以将数据写入任何用Write(b []byte) (n int, err error)方法实现接口的东西。现在,在我的程序中,我编写了一个实际的Conn,但是遵循最佳实践(https://dave.cheney.net/2016/08/20/solid-go-design),并且由于我只调用Write,所以我希望接受实现该方法的最小接口。为此,我接受一个带有接口io.Writer的参数。

由于我的函数可以非常快地输出大量数据,我应该接受bufio.Writer吗?还是函数的使用者责任是使用缓冲的作者而不是普通的作者?什么是最佳做法?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-05 14:34:27

创建您的函数以接受io.Writer,并创建document,它将编写大量数据,因此建议使用bufio.Writer或类似的构造。

不要将函数的用户限制为bufio.Writer,因为您只使用io.Writer的功能。此外,用户可能有其他io.Writer的“缓冲”实现,这对他们来说已经足够了。

不要决定什么对你的库的用户有好处,让他们来决定什么对他们有好处。如果用户发现bufio.Writer有用或者比他们的io.Writer实现更好,他们总是可以将它包装在bufio.Writer中并传递给它(只使用bufio.NewWriter(w))。

如果创建函数以接受io.Writer,用户总是可以很容易地使用一行实用程序函数添加包装功能:

代码语言:javascript
复制
func wrapAndPass(w io.Writer) {
    yourFunction(bufio.NewWriter(w))
}

如果您创建函数来接受bufio.Writer,那么用户就无法撤消这个“包装”。用户将被迫始终创建和传递一个bufio.Writer,不管它是否需要。

您还可以选择提供两个函数:原始函数采用io.Writer,以及上面的包装和传递实用程序函数。如果这样做,最好检查传递的写入器是否已经是*bufio.Writer,在这种情况下,应该避免包装。就像这样:

代码语言:javascript
复制
func wrapIfNeededAndPass(w io.Writer) {
    if _, ok := w.(*bufio.Writer); !ok {
        w = bufio.NewWriter(w)
    }
    yourFunction(w)
}

但是,这种包装通常只在需要“超出”io.Writer的额外功能时应用。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48115577

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档