我需要在 Go 中创建一个 1048577 个字符(1MB + 1 字节)的字符串。字符串的内容完全不重要。有没有办法在不连接或使用缓冲区的情况下直接分配它?
另外,值得注意的是,string 的值不会改变。用于单元测试以验证太长的字符串将返回错误。
使用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)
这种方法不符合问题中提出的要求。它使用额外的缓冲区而不是直接分配字符串。
我最终使用了这个:
string(make([]byte, 1048577))
Run Code Online (Sandbox Code Playgroud)
https://play.golang.org/p/afPukPc1Esr