Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Go中分配大字符串的最快方法?_Go - Fatal编程技术网

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

在Go中分配大字符串的最快方法?,go,Go,我需要在Go中创建一个1048577个字符(1MB+1字节)的字符串。字符串的内容完全不重要。有没有一种方法可以在不连接或使用缓冲区的情况下直接分配 另外,值得注意的是字符串的值不会改变。单元测试用于验证过长的字符串是否会返回错误。用于在不使用额外缓冲区的情况下分配字符串 var b strings.Builder b.Grow(1048577) for i := 0; i < 1048577; i++ { b.WriteByte(0) } s := b.String() 如果您询问

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

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

用于在不使用额外缓冲区的情况下分配字符串

var b strings.Builder
b.Grow(1048577)
for i := 0; i < 1048577; i++ {
  b.WriteByte(0)
}
s := b.String()
如果您询问如何使用最简单的代码执行此操作,请使用以下命令:

s := string(make([]byte, 1048577)
这种方法不符合问题中提出的要求。它使用一个额外的缓冲区,而不是直接分配字符串

我最后用了这个:

string(make([]byte, 1048577))

我需要回路吗?是否需要将最后一个字节设置为零?扩展生成器长度的唯一方法是使用Write、WriteByte、WriteRune或WriteString追加数据。没有SetLength(int)或类似的调用,“单元测试”和“最快方式”听起来是矛盾的。在单元测试中,您应该始终追求简单而不是性能。在测试中,性能并不像在生产代码中那样重要。您在回答中提出的方法对于单元测试来说是非常好的。ThunderCat最初提到了这个确切的方法,为什么不接受他的答案呢?我在@ThunderCat只有第一个代码样本时提供了这个答案。我最初没有回答这个问题,因为您要求“不连接或使用缓冲区”的解决方案。这个答案使用了一个缓冲区。
string(make([]byte, 1048577))