Golang随机字符串和整数生成器实现指南

Golang随机字符串和整数生成器实现指南 我想分享我的Go包,很乐意听取大家的意见。

https://github.com/saturnavt/random

random

Go编程的随机字符串和整数生成器

#安装

  1. 获取包
$ go get github.com/saturnavt/random
  1. 在你的代码中导入它:
import "github.com/saturnavt/random"

#快速开始

随机字符串

package main

import (
  "fmt"
  "github.com/saturnavt/random"
)

func main() {
  fmt.Println(random.RandomString(12)) //将12替换为你想要的字符串长度,输出示例 'rlJlGUgEpLnE'
}

随机整数

package main

import (
  "fmt"
  "github.com/saturnavt/random"
)

func main() {
  fmt.Println(random.RandomNumber(80, 0)) //80是最大数,0是最小数,替换为你自己的最大值和最小值,输出示例 '25'
}

更多关于Golang随机字符串和整数生成器实现指南的实战教程也可以访问 https://www.itying.com/category-94-b0.html

3 回复

谢谢,我明天会处理。如果你愿意,也可以在 GitHub 上贡献代码 ;p

更多关于Golang随机字符串和整数生成器实现指南的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


做得不错,但最好将参数保持自然顺序,即 (min, max)。当然,还有正确的格式化 (go fmt)。

看了你的random包,实现思路很清晰。不过有几个技术细节可以优化:

  1. 随机数生成器的并发安全:你的实现每次调用都创建新的rand.Source,这在并发场景下会有性能开销。建议使用全局的线程安全生成器:
var (
    globalRand = rand.New(rand.NewSource(time.Now().UnixNano()))
    mu         sync.Mutex
)

func RandomString(length int) string {
    mu.Lock()
    defer mu.Unlock()
    // ... 使用 globalRand
}
  1. 字符集定义:当前字符集只包含大小写字母,可以考虑提供可配置选项:
const (
    Letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
    Numbers = "0123456789"
    Symbols = "!@#$%^&*()_+-=[]{}|;:,.<>?"
)

func RandomStringWithCharset(length int, charset string) string {
    b := make([]byte, length)
    for i := range b {
        b[i] = charset[globalRand.Intn(len(charset))]
    }
    return string(b)
}
  1. 随机整数边界检查RandomNumber函数需要添加参数验证:
func RandomNumber(max, min int) int {
    if min > max {
        min, max = max, min
    }
    if min == max {
        return min
    }
    return globalRand.Intn(max-min+1) + min
}
  1. 密码生成示例:可以添加更实用的生成函数:
func RandomPassword(length int) string {
    charset := Letters + Numbers + Symbols
    return RandomStringWithCharset(length, charset)
}

// 使用示例
func main() {
    fmt.Println(random.RandomPassword(16)) // 生成16位安全密码
}
  1. 性能优化:字符串生成可以使用strings.Builder
func RandomString(length int) string {
    var sb strings.Builder
    sb.Grow(length)
    for i := 0; i < length; i++ {
        sb.WriteByte(Letters[globalRand.Intn(len(Letters))])
    }
    return sb.String()
}

这些改进会让你的包更健壮、更实用。当前版本已经能满足基本需求,上述建议主要针对生产环境使用场景。

回到顶部