2 回答
TA贡献1803条经验 获得超3个赞
一般的想法是您必须在输入切片中的任何位置查找连续的换行符,如果存在这种情况,请跳过除第一个换行符之外的所有内容。
此外,您必须跟踪写入的最后一个字节是否为换行符,以便下次调用Write时知道是否需要删除换行符。通过bool在您的作家类型中添加一个,您走在正确的轨道上。但是,您需要在此处使用指针接收器而不是值接收器,否则您将修改结构的副本。
你想改变
func (c condensingWriter) Write(b []byte)
到
func (c *condensingWriter) Write(b []byte)
你可以尝试像这样。您必须使用更大的输入进行测试,以确保它正确处理所有情况。
package main
import (
"bytes"
"io"
"os"
)
var Newline byte = byte('\n')
type ReduceNewlinesWriter struct {
w io.Writer
lastByteNewline bool
}
func (r *ReduceNewlinesWriter) Write(b []byte) (int, error) {
// if the previous call to Write ended with a \n
// then we have to skip over any starting newlines here
i := 0
if r.lastByteNewline {
for i < len(b) && b[i] == Newline {
i++
}
b = b[i:]
}
r.lastByteNewline = b[len(b) - 1] == Newline
i = bytes.IndexByte(b, Newline)
if i == -1 {
// no newlines - just write the entire thing
return r.w.Write(b)
}
// write up to the newline
i++
n, err := r.w.Write(b[:i])
if err != nil {
return n, err
}
// skip over immediate newline and recurse
i++
for i < len(b) && b[i] == Newline {
i++
}
i--
m, err := r.Write(b[i:])
return n + m, nil
}
func main() {
r := ReduceNewlinesWriter{
w: os.Stdout,
}
io.WriteString(&r, "this\n\n\n\n\n\n\nhas\nmultiple\n\n\nnewline\n\n\n\ncharacters")
}
- 2 回答
- 0 关注
- 335 浏览
添加回答
举报