// Package utils generator_util.go package utils import ( "fmt" "math/rand" "strings" "time" ) // GenerateUserCode 生成指定前缀 + 指定长度随机数字的编码 // prefix: 字符串前缀,如 "S", "U" 等 // length: 数字部分长度,默认为 9 位 // 返回带前缀的 usercode,例如 S123456789 func GenerateUserCode(prefix string, length int) string { // 设置随机种子 rand.Seed(time.Now().UnixNano()) // 计算数字范围 mini := 1 maxi := 9 for i := 1; i < length; i++ { mini *= 10 maxi = maxi*10 + 9 } // 生成随机数 randomNum := rand.Intn(maxi-mini+1) + mini return fmt.Sprintf("%s%d", prefix, randomNum) } // GenerateEmail 生成随机电子邮箱地址 // domain: 邮箱域名,默认为 "example.com" // usernameLength: 用户名部分长度,默认为 8 位 // 返回随机邮箱地址,如 "a1b2c3d4@example.com" func GenerateEmail(domain string, usernameLength int) (string, error) { // 设置随机种子 rand.Seed(time.Now().UnixNano()) // 如果域名为空,使用默认域名 if domain == "" { domain = "example.com" } // 如果用户名长度小于1,使用默认长度 if usernameLength < 1 { usernameLength = 8 } // 定义字符集(小写字母和数字) charset := "abcdefghijklmnopqrstuvwxyz0123456789" // 最多重试 5 次 for i := 0; i < 5; i++ { // 生成指定长度的用户名 username := make([]byte, usernameLength) for j := range username { username[j] = charset[rand.Intn(len(charset))] } email := fmt.Sprintf("%s@%s", string(username), domain) // 检查邮箱有效性 if isValidEmail(email) { return email, nil } } return "", fmt.Errorf("无法生成有效邮箱地址,请调整参数") } // isValidEmail 简单验证邮箱地址有效性 func isValidEmail(email string) bool { parts := strings.Split(email, "@") if len(parts) != 2 { return false } username := parts[0] domain := parts[1] // 检查用户名和域名是否非空 if username == "" || domain == "" { return false } // 检查域名是否包含点 if !strings.Contains(domain, ".") { return false } // 检查域名的点是否在正确位置 domainParts := strings.Split(domain, ".") for _, part := range domainParts { if part == "" { return false } } return true } // GenerateUsername 生成全英文随机用户名 // length: 用户名长度,默认为 8 // 返回全小写英文用户名,例如 "abcdefgh" // 如果长度参数无效会返回错误 func GenerateUsername(length int) (string, error) { // 设置随机种子 rand.Seed(time.Now().UnixNano()) // 验证长度参数 if length < 4 || length > 20 { return "", fmt.Errorf("用户名长度需在4-20个字符之间") } // 定义字符集(仅小写字母) charset := "abcdefghijklmnopqrstuvwxyz" // 生成指定长度的用户名 username := make([]byte, length) for i := range username { username[i] = charset[rand.Intn(len(charset))] } return string(username), nil }