我需要在Go中创建一个1048577个字符(1MB + 1个字节)的字符串。字符串的内容完全不重要。有没有办法直接分配它而不连接或使用缓冲区?
另外,值得注意的是string的值不会改变。这是一个单元测试,用于验证太长的字符串是否会返回错误。
答案 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)