我有一个函数,它可以将数据写入任何用Write(b []byte) (n int, err error)方法实现接口的东西。现在,在我的程序中,我编写了一个实际的Conn,但是遵循最佳实践(https://dave.cheney.net/2016/08/20/solid-go-design),并且由于我只调用Write,所以我希望接受实现该方法的最小接口。为此,我接受一个带有接口io.Writer的参数。
由于我的函数可以非常快地输出大量数据,我应该接受bufio.Writer吗?还是函数的使用者责任是使用缓冲的作者而不是普通的作者?什么是最佳做法?
发布于 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,用户总是可以很容易地使用一行实用程序函数添加包装功能:
func wrapAndPass(w io.Writer) {
yourFunction(bufio.NewWriter(w))
}如果您创建函数来接受bufio.Writer,那么用户就无法撤消这个“包装”。用户将被迫始终创建和传递一个bufio.Writer,不管它是否需要。
您还可以选择提供两个函数:原始函数采用io.Writer,以及上面的包装和传递实用程序函数。如果这样做,最好检查传递的写入器是否已经是*bufio.Writer,在这种情况下,应该避免包装。就像这样:
func wrapIfNeededAndPass(w io.Writer) {
if _, ok := w.(*bufio.Writer); !ok {
w = bufio.NewWriter(w)
}
yourFunction(w)
}但是,这种包装通常只在需要“超出”io.Writer的额外功能时应用。
https://stackoverflow.com/questions/48115577
复制相似问题