【发布时间】:2015-02-05 20:21:13
【问题描述】:
我有一个呈现文件的 Go 文本/模板,但是我发现很难在保持输出中的换行符的同时清晰地构建模板。
我想在模板中添加额外的、不必要的换行符以使其更具可读性,但从输出中删除它们。任何多于普通段落分隔符的换行符组都应压缩为普通段落分隔符,例如
lines with
too many breaks should become lines with
normal paragraph breaks.
字符串可能太大而无法安全存储在内存中,因此我想将其保留为输出流。
我的第一次尝试:
type condensingWriter struct {
writer io.Writer
lastLineIsEmpty bool
}
func (c condensingWriter) Write(b []byte) (n int, err error){
thisLineIsEmpty := strings.TrimSpace(string(b)) == ""
defer func(){
c.lastLineIsEmpty = thisLineIsEmpty
}()
if c.lastLineIsEmpty && thisLineIsEmpty{
return 0, nil
} else {
return c.writer.Write(b)
}
}
这不起作用,因为我天真地假设它会缓冲换行符,但事实并非如此。
关于如何让它工作的任何建议?
【问题讨论】:
-
或许以此Play为起点:
-
~100 MB 在非常小的服务器上。
-
虽然我不明白为什么这对这个问题很重要,除非你要回答“不要”。
-
请注意,您有一个值接收器,因此下一次
Write调用将无法观察到c.lastLineIsEmpty = thisLineIsEmpty。