3 回答

TA贡献1765条经验 获得超5个赞
新的方法:
从Go 1.10开始,有一种strings.Builder类型,请查看此答案以获取更多详细信息。
旧方法:
使用bytes包装。它具有Buffer实现的类型io.Writer。
package main
import (
"bytes"
"fmt"
)
func main() {
var buffer bytes.Buffer
for i := 0; i < 1000; i++ {
buffer.WriteString("a")
}
fmt.Println(buffer.String())
}
这是在O(n)时间内完成的。

TA贡献1780条经验 获得超1个赞
在Go 1.10+中strings.Builder,这里是。
生成器用于使用Write方法有效地构建字符串。它最大程度地减少了内存复制。零值可以使用了。
例子
与几乎相同bytes.Buffer。
package main
import (
"strings"
"fmt"
)
func main() {
// ZERO-VALUE:
//
// It's ready to use from the get-go.
// You don't need to initialize it.
var sb strings.Builder
for i := 0; i < 1000; i++ {
sb.WriteString("a")
}
fmt.Println(sb.String())
}
支持的接口
正在考虑现有接口的情况下实现StringBuilder的方法。这样您就可以在代码中轻松切换到新的Builder类型。
Grow(int)-> bytes.Buffer#Grow
Len()int- > bytes.Buffer#Len
Reset()-> bytes.Buffer#Reset
String()字符串-> fmt.Stringer
Write([] byte)(int,error)-> io.Writer
WriteByte(byte)错误-> io.ByteWriter
WriteRune(rune)(int,error)-> bufio.Writer#WriteRune - bytes.Buffer#WriteRune
WriteString(string)(int,error)-> io.stringWriter
与bytes.Buffer的差异
它只能增长或重置。
它具有内置的copyCheck机制,可防止意外复制它:
func (b *Builder) copyCheck() { ... }
在中
bytes.Buffer
,您可以像这样访问基础字节:(*Buffer).Bytes()
。strings.Builder
可以防止此问题。有时,这不是问题,而是需要的。
例如:对于将字节传递给
io.Reader
etc时的偷窥行为。bytes.Buffer.Reset()
倒带并重用基础缓冲区,而strings.Builder.Reset()
not则分离缓冲区。
笔记
不要复制StringBuilder值,因为它会缓存基础数据。
如果要共享StringBuilder值,请使用指向它的指针。
- 3 回答
- 0 关注
- 220 浏览
添加回答
举报