Jon Calhoun
rand
- StringWithCharset() - 此函数将包含字符集和长度,并用该字符集生成随机字符串。
- String() - 此函数只占用长度,并用设置为默认字符的字符串生成随机字符串。
randrand.String(10)
用相同的包名包装另一个包似乎很奇怪,但根据我的经验(以及 其他人的经验 ),当你希望根据构建的内容包装包时,或者如果你想隔离与应用程序的其他部分无关的一些细节,这种模式会很好地工作。
math/randrand
旁注:我曾经写过关于在 Go 中使用字符串的技巧列表,其中有生成随机字符串的部分,但是我觉得这个主题值得单独发表,因为它本身是一个非常常见的请求。
rand
randstrings.go
randrand
rand/strings.go
rand/strings.goinit()math/rand
package rand import ( "math/rand" "time" ) var seededRand *rand.Rand = rand.New( rand.NewSource(time.Now().UnixNano()))
对于以前写过 Go 的人来说,前几行应该很熟悉 — 我们首先声明我们的包,再在后面导入一些说明我们将在代码中使用的包。
seedrand*rand.Randmath/randmath/rand
rand.Seed(time.Now().UnixNano())rand.Seed(1)rand.Rand
rand.New()rand.Source
rand.Randmath/randmath/rand
math/rand
package main import ( "fmt" "math/rand" ) func main() { fmt.Println("1:", rand.Int()) fmt.Println("2:", rand.Int()) fmt.Println("3:", rand.Int()) }
你的输出和我的一样吗?
1: 5577006791947779410 2: 8674665223082153551 3: 6129484611666145821
虽然它可能并不总是这样,但计算机所做的一切都不是随机的,因此创建一个真正的随机数生成器是一个具有挑战性的问题。相反,我们可以做的是种子一个随机数发生器的值,将改变每次我们运行我们的程序。这将给我们一个生成过程,它将生成伪随机数,而且由于每次程序运行时种子都会发生变化,因此我们不必担心它会变得可预测。
如果你正在处理更敏感的代码,比如加密包,这可能不是最适合你的,但是我将假设,如果你正在构建一个你知道的足够多的加密包,可以进行此调用。
StringWithCharset()
charset := "abcABC123"
综上所述,我们可以用下面的代码编写函数。我们将很快讨论实现细节,但现在来看一下代码。
func StringWithCharset(length int, charset string) string { b := make([]byte, length) for i := range b { b[i] = charset[seededRand.Intn(len(charset))] } return string(b) }
length
seededRand.Intn()0n - 1n
最后,我们将字节片转换成字符串并返回它。
String()StringWithCharset()StringWithCharset()
a-za-z0-9
const charset = "abcdefghijklmnopqrstuvwxyz" + "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
Strings()StringWithCharset()
func String(length int) string { return StringWithCharset(length, charset) }
好啦。以防万一,你的最终代码最终应该类似于下边这样哈~。
package rand import ( "math/rand" "time" ) const charset = "abcdefghijklmnopqrstuvwxyz" + "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" var seededRand *rand.Rand = rand.New( rand.NewSource(time.Now().UnixNano())) func StringWithCharset(length int, charset string) string { b := make([]byte, length) for i := range b { b[i] = charset[seededRand.Intn(len(charset))] } return string(b) } func String(length int) string { return StringWithCharset(length, charset) }