Golang实现获取指定长度的随机字符串

本文将详细的介绍Go语言中如何正确使用rand.Intn()函数作为核心,来生成指定长度的随机字符串。

既然是随机的,我们就需要用到随机函数。我们需要导入math/rand这个包。

import (
	"time"
	"math/rand"
)

我们需要使用time.Now().UnixNano()获取当前系统时间戳作为随机数的种子。

func init(){
	rand.Seed(time.Now().UnixNano()) 
}

使用rand.Seed()设置初始数值。因为计算机生成的随机数实际上并不是真正的随机数,而是伪随机数;如果计算随机序列的初始数值相同,那么计算出的随机序列也会是相同的。所以我们要对随机数值设置,以确保程序每次运行时所产生的随机数不同。

这段代码放在init()函数中,init()不需要调用,会在导入时运行或运行于 main() 函数前。

定义一个rune切片,当然,你也可以使用byte切片,占用更少的内存:

var letters  = []rune("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")

你也可以向其加入特殊字符。

实现函数如下:

func  GetRandomString(l int) string {
	b := make([]rune, l)
    for i := range b {
        b[i] = letters[rand.Intn(len(letters))]
    }
    return string(b)
}

GetRandomString()函数须传递一个int值,表明为随机数的长度,成功运行则返回 一个string类型的值。

首先创建一个临时的 rune 切片,用于存储要返回的值。

b := make([]rune, l)

通过rand.Intn(n)获取一个 0 – n 的随机数。n 不能<=0,否则将触发一个panic。这里我们的 n 就是 字符串种子的长度。

rand.Intn(len(letters))

从字符串种子里获得一个随机字符:

letters[rand.Intn(len(letters))]

遍历 b,将随机字符顺序的写入,最后使用 string 函数将 rune 切片转换成字符串返回。

完整源码:

package main

import (
	"time"
	"math/rand"
)

var letters  = []rune("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")

//GetRandomString ...
func  GetRandomString(l int) string {
	b := make([]rune, l)
    for i := range b {
        b[i] = letters[rand.Intn(len(letters))]
    }
    return string(b)
}

func init(){
	rand.Seed(time.Now().UnixNano()) 
}

其实上面这段代码是还有优化余地的,比如将 rune 切片换成 byte 切片,可以节省一些内存;然后是 len(letters) 完全可以运行在 for 块外面,而不是在 for 中被执行多次:

	sl := len(letters)
    for i := range b {
        b[i] = letters[rand.Intn(sl)]
    }

还有一点,该函数的复用性并不强,因为无法指定字符串种子。

func GetRandomString(l int) string{}

完全可以更改成这种形式:

func GetRandomString(l int,s [] rune) string{}

原创内容,如需转载,请注明出处;

本文地址: https://www.perfcode.com/p/1537.html

分类: 计算机技术
推荐阅读:
Python min()函数 min() 是 Python 的内置函数之一,用于返回给定可迭代对象中的最小值。该函数可以接受多个参数,也可以接受一个可迭代对象作为参数。
Linux找出目录下所有内容重复的文件(包含子目录) 在Linux系统下,如果你想找出某个目录下(包含子目录)所有内容重复的文件,你可以使用这一条命令实现:
如何查看硬盘序列号(S/N) 要在Windows系统上查看硬盘序列号只需要打开命令提示符【CMD】,运行以下命令:wmic diskdrive get model,serialnumber;黄色部分是你的硬盘名称,红色部分则是硬盘序列号;
让自己的网页在手机QQ中以卡片的方式分享出去 在使用QQ进行聊天的过程中,发送自己网页的链接时(不是打开网站后分享给好友,单单指将网页链接以文本的形式发送出去),默认情况下是不会以卡片形式显示的,那么如何让别人看到的是卡片呢。
使用pyi-set_version为PyInstaller打包出来的程序附加版本信息 本文将讲述如何使用 pyi-grab_version 获取版本信息的模板文件,以及使用 pyi-set_version 为打包好的程序附加版本信息。
Python this模块的加密原理 this模块的代码(this模块位于Python安装目录/lib下)。定义了2个变量;字符串s和字典d(被定义两次);s很明显是一段密文,d则是密码字典,key和value对应的是密文和原文;chr((i&#43;13)%26 &#43;c) 则是加密算法,其原理是通过向字典d写入KEY为字符A~Z,VALUE为加密后的字符。然后通过字典遍历的方法,匹配出正确的字符。