如何创建任意长度的字符串

时间:2019-01-08 12:40:06

标签: string go

我想创建一个给定长度的虚拟字符串来进行性能测试。例如,我想先测试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"

我意识到它与编码有关。但是如何解决此问题,以便创建由给定长度的字节数组支持的任何字符串,以便在通过网络进行写入时生成所需的有效载荷。

1 个答案:

答案 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?