为了账号安全,请及时绑定邮箱和手机立即绑定

如何在Go中有效地串联字符串

如何在Go中有效地串联字符串

Go
慕后森 2021-04-08 14:11:55
在Go中,astring是一种原始类型,这意味着它是只读的,对其的每次操作都会创建一个新的字符串。因此,如果我想多次连接字符串而又不知道结果字符串的长度,那么最好的方法是什么?天真的方法是:var s stringfor i := 0; i < 1000; i++ {    s += getShortStringFromSomewhere()}return s但这似乎不是很有效。
查看完整描述

3 回答

?
POPMUISE

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)时间内完成的。



查看完整回答
反对 回复 2021-04-26
?
慕神8447489

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.Readeretc时的偷窥行为。

  • bytes.Buffer.Reset() 倒带并重用基础缓冲区,而strings.Builder.Reset() not则分离缓冲区。


笔记

  • 不要复制StringBuilder值,因为它会缓存基础数据。

  • 如果要共享StringBuilder值,请使用指向它的指针。


查看完整回答
反对 回复 2021-04-26
  • 3 回答
  • 0 关注
  • 220 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号