在Go中生成一个随机字符串的方法

3,596 阅读1分钟

要在Go中生成随机字符串,你需要编写一个自定义函数,从给定的字符集中随机选择字符,其次数与输出的设定长度相同,并将其组合成一个随机的、固定长度的字符串。

package main

import (
    "fmt"
    "math/rand"
    "strings"
    "time"
)

const charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"

func randomString(n int) string {
    sb := strings.Builder{}
    sb.Grow(n)
    for i := 0; i < n; i++ {
        sb.WriteByte(charset[rand.Intn(len(charset))])
    }
    return sb.String()
}

func main() {
    rand.Seed(time.Now().UnixNano())

    fmt.Println(randomString(20))
}

它是如何工作的

randomString() 函数

  1. strings.Builder 的初始化
sb := strings.Builder{}
sb.Grow(n)

在第一步中,我们创建一个 strings.Builder结构,并将其容量增加到输出字符串的大小:n 。该 strings.Builder用来有效地连接字符串,最大限度地减少拷贝和内存分配的数量。在我们的函数中,它被用来建立和存储输出的随机字符串。

  1. 随机字符生成的循环
for i := 0; i < n; i++ {
    sb.WriteByte(charset[rand.Intn(len(charset))])
}

for 循环中,我们生成n (输出字符串的大小)随机字符,并将它们添加到先前创建的 strings.Builder.选择随机字符的工作是由 rand.Intn()函数完成,它返回一个介于0和X 之间的随机数,其中X 是该函数的参数。 rand.Intn()函数的参数。在我们的例子中,charset[rand.Intn(len(charset))] 意味着我们在半开区间[0,len(charset))中选择一个随机数,然后在这个随机索引中从charset 字符串中获取一个字符。这样做n 次,并将结果相加,得到一个长度为n 的随机字符串。

如果你想限制或添加新的字符到制作随机字符串的集合中,请修改charset 常数。

  1. 返回结果
return sb.String()

通过调用 Builder.String()方法,我们得到了从函数中返回的累积字符串。

main() 函数

  1. 种子
rand.Seed(time.Now().UnixNano())

main() 函数的第一行,我们设置了当前时间的时间戳 time.Now().UnixNano()作为伪随机数发生器的种子。没有它,该 rand.Intn()函数每次都会返回相同的结果,而且在程序运行期间输出的字符串也会保持不变。这是因为伪随机数生成器通过对前一个值进行一些操作而产生新的数值,当初始值(种子值)保持不变时,你就会得到相同的输出数字。

  1. 调用randomString() 函数
fmt.Println(randomString(20))

在最后一行,我们生成一个长度为20的随机字符串并将其打印到标准输出。多次运行该程序,每次都能看到不同的字符串。

XqtscOKPBRGnAXMnzKzq
APHQenfBuRrTlMzDShyr
dfXgMuGTnfUkLVZQXonw