随机值

math/rand

package main

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

func main() {
	s := rand.NewSource(time.Now().Unix())
	rd := rand.New(s)
	fmt.Println(rd.Intn(100))
}
package main

import (
	"crypto/rand"
	"fmt"
	"math/big"
)

func main() {
	// 生成 0 到 10 的随机整数
	randInt, _ := rand.Int(rand.Reader, big.NewInt(11)) // 生成 0 到 10 的随机整数
	randomNum := randInt.Int64()

	fmt.Println(randomNum)
	//生成数组
	td, _ := GenerateRandomBytes(5)
	var ints = make([]int, len(td))
	for i, b := range td {
		ints[i] = int(b)
	}
	fmt.Println(ints)
}

func GenerateRandomBytes(n int) ([]byte, error) {
	b := make([]byte, n)
	_, err := rand.Read(b)
	if err != nil {
		return nil, err
	}
	return b, nil
}

生成随机 Token

在实际业务中经常需要生成随机 Token(如 API Key、会话令牌等),思路是先用 crypto/rand 读取指定字节数的密码学安全随机值,再用 hex.EncodeToString 编码为十六进制字符串。最终字符串长度是字节数的 2 倍,例如传入 32 得到 64 位字符的 Token:

package main

import (
	"crypto/rand"
	"encoding/hex"
	"fmt"
)

func onboardGenerateToken(bytes int) string {
	b := make([]byte, bytes)
	_, _ = rand.Read(b)
	return hex.EncodeToString(b)
}

func main() {
	// 32 字节 -> 64 位十六进制字符
	fmt.Println(onboardGenerateToken(32))
}

输出示例:

9d4f1a2b8c6e3f0d5a7b9c1e4f2d6a8b0c3e5f7d9a1b3c5e7f2d4a6b8c0e2f4d

注意:这里使用的是 crypto/rand(密码学安全)而非 math/rand(伪随机),生成 Token、密钥等安全敏感场景必须使用前者。