在 Go 中分配大字符串的最快方法?

Ell*_*nce 4 go

我需要在 Go 中创建一个 1048577 个字符(1MB + 1 字节)的字符串。字符串的内容完全不重要。有没有办法在不连接或使用缓冲区的情况下直接分配它?

另外,值得注意的是,string 的值不会改变。用于单元测试以验证太长的字符串将返回错误。

Cer*_*món 7

使用strings.Builder分配字符串而不使用额外的缓冲区。

var b strings.Builder
b.Grow(1048577)
for i := 0; i < 1048577; i++ {
  b.WriteByte(0)
}
s := b.String()
Run Code Online (Sandbox Code Playgroud)

Grow方法的调用分配了一个容量为 1048577 的切片。WriteByte 调用将切片填充到容量。该字符串()方法使用不安全的到片转换为字符串。

通过一次写入 N 个字节的块并在最后填充单个字节,可以降低循环的成本。

如果你不反对使用 unsafe 包,那么使用这个:

p := make([]byte, 1048577)
s := *(*string)(unsafe.Pointer(&p))
Run Code Online (Sandbox Code Playgroud)

如果您正在询问如何使用最简单的代码执行此操作,请使用以下内容:

s := string(make([]byte, 1048577)
Run Code Online (Sandbox Code Playgroud)

这种方法不符合问题中提出的要求。它使用额外的缓冲区而不是直接分配字符串。


Ell*_*nce 5

我最终使用了这个:

string(make([]byte, 1048577))
Run Code Online (Sandbox Code Playgroud)

https://play.golang.org/p/afPukPc1Esr