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)
}