我想创建一个给定长度的虚拟字符串来进行性能测试。例如,我想先测试1 KB的字符串,然后再测试10 KB的字符串,等等。我不在乎它填充的是哪个字符(或符文?)。我知道Go中的字符串由字节数组支持。因此,我希望最后一个字符串由一个字节数组来支持,该字节数组的大小等效于1 KB(如果我给出1024作为参数)。
例如,我尝试了以下蛮力代码:
...
oneKBPayload := createPayload(1024, 'A')
...
//I don't mind even if the char argument is removed and 'A' is used for example
func createPayload(len int, char rune) string {
payload := make([]byte, len)
for i := 0; i < len; i++ {
payload = append(payload, byte(char))
}
return string(payload[:])
}
它产生的结果是(长度为10)
"\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000AAAAAAAAAA"
我意识到它与编码有关。但是如何解决此问题,以便创建由给定长度的字节数组支持的任何字符串,以便在通过网络进行写入时生成所需的有效载荷。
答案 0 :(得分:3)
您的createPayload()
创建一个具有给定长度的字节片,默认情况下该字节片用零填充(zero value)。然后,将len
的{{1}}数附加到该切片中,这样结果将是您要创建的长度的两倍(假设runes
小于rune
),并且这就是为什么打印时看到零,然后是127
符文的原因。
如果将其更改为:
'A'
然后结果就是您想要的。
但更简单的方法是简单地使用strings.Repeat()
,它会重复payload := make([]byte, 0, len)
的给定值string
。重复一个n
值的单字(或更具体地是一个字节)string
倍,您将获得所需的内容:
n
这将输出(在Go Playground上尝试):
s := strings.Repeat("A", 10)
fmt.Println(len(s), s)
如果您不关心10 AAAAAAAAAA
的内容,而仅关心其长度,则只需转换一个字节片,如下所示:
string
或者像这样:
s := string(make([]byte, 1024))
fmt.Println(len(s))
两个都打印s2 := string([]byte{1023: 0})
fmt.Println(len(s2))
。在Go Playground上尝试一下。
如果您确实关心内容,并且已经分配了字节片,则可以通过以下方式有效地填充它:Is there analog of memset in go?