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

时间:2018-05-23 23:40:32

标签: go

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

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

2 个答案:

答案 0 :(得分:4)

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

//somewhere else in the code
 for (anotherMyObject : listOfEveryMyObjectEverMade){
 anotherMyObject.get(id)
 }
/*returns the id of the item in the listview. as i understand a specific id 
is assigned to every item in the list. so if an object has never been in that 
particular list, it wont have that same id
*/

Grow方法的调用会分配容量为1048577的切片.WriteByte调用会将切片填充到容量中。 String()方法使用unsafe将该切片转换为字符串。

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

如果您不反对使用不安全的软件包,请使用:

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

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

p := make([]byte, 1048577)
s := *(*string)(unsafe.Pointer(&p))

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

答案 1 :(得分:2)

我最终使用了这个:

string(make([]byte, 1048577))

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