【Go每日一练】随机密码生成器

👻创作者:丶重明
👻创作时间:2025年3月17日
👻擅长领域:运维

目录

1.😶‍🌫️题目:随机密码生成器

编写一个Go语言程序,生成一个随机密码。该密码需要包含字母(大写、小写)和数字,并确保密码的长度由用户自己决定,但是不能低于8位。

开发要求:

  • 生成的密码应该包含小写字母、大写字母和数字。
  • 密码的长度由用户输入。
  • 如果输入的长度小于 8,则提示用户重新输入。

2.😶‍🌫️密码生成可用资源

go 复制代码
abcdefghijklmnopqrstuvwxyz
ABCDEFGHIJKLMNOPQRSTUVWXYZ
0123456789
!@#$%^&*()_+-=[]{};':\",./<>?

3.😶‍🌫️代码开发

go 复制代码
package main

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

const (
	lowercase = "abcdefghijklmnopqrstuvwxyz"
	uppercase = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
	digits    = "0123456789"
	specials  = "!@#$%^&*()_+-=[]{};':\",./<>?"
)

func generatePassword(length int) string {
	if length < 8 {
		fmt.Println("密码的长度不能低于8位噢.")
		return ""
	}
	
	charSet := lowercase + uppercase + digits + specials
	var password strings.Builder

	for i := 0; i < length; i++ {
		index, _ := rand.Int(rand.Reader, big.NewInt(int64(len(charSet))))
		password.WriteByte(charSet[index.Int64()])
	}

	return password.String()
}
func main() {
	var length int
	fmt.Println("请输入密码的长度:")
	fmt.Scanln(&length)

	password := generatePassword(length)
	fmt.Println("生成的密码为:", password)
}

4.😶‍🌫️代码输出

保存代码文件,执行go run运行代码

go 复制代码
> go run .\11.gotest.go
请输入密码的长度:
11
生成的密码为: QL"nOg=akp.

> go run .\11.gotest.go
请输入密码的长度:
16
生成的密码为: QaJJUbnw9=]v"S:<

> go run .\11.gotest.go
请输入密码的长度:
7
密码的长度不能低于8位噢.
生成的密码为: 

5.😶‍🌫️代码解析

1. 字符集:

我们定义了四个常量(const),分别为大写字母、小写字母、数字和特殊符号。

使用字符串拼接的方法将四个常量加在一起然后赋值给变量charSet。

2. 生成密码:

使用rand.Int(rand.Reader, big.NewInt(int64(len(charSet))))从字符集charSet 中随机选择一个字符,并将其添加到密码字符串中。

rand int是 crypto/rand 包中的一个函数,用于生成一个随机的 *big.Int 类型的整数.

rand.Reader是一个全局变量,是一个密码学安全的随机数生成器,通常用于生成高质量的随机数。

big.NewInt 是 math/big 包中的一个函数,用于创建一个 *big.Int 类型的整数.

len(charSet) 返回字符集 charSet 的长度(字符的数量)

int64(len(charSet)) 将长度转换为 int64类型,因为 big.NewInt 需要一个 int64 类型的参数。

3. 用户输入长度:

程序首先要求用户输入密码的长度,如果输入的长度小于 8,程序会提示用户不合规范。

4.输出密码:

在用户输入合适的密码长度后,程序生成并输出随机密码。

6.😶‍🌫️本文知识点

6.1.😶‍🌫️math/big

math/big 是 Go 语言标准库中的一个包,用于处理大整数(big.Int)、大浮点数(big.Float)和有理数(big.Rat)。

它的主要作用是解决标准数据类型(如 int、int64、float64 等)无法处理的大数计算问题。

核心类型:

  • big.Int:用于表示任意精度的整数,支持运算
  • big.Float:用于表示任意精度的浮点数,支持运算
  • big.Rat:用于表示有理数(分数)

6.2.😶‍🌫️strings

strings 是 Go 语言标准库中的一个包,专门用于处理字符串操作。

它提供了丰富的函数,用于字符串的查找、替换、分割、连接、修剪、比较等常见操作。

本文用到了strings.Builder类型,它通过内部的字节缓冲区来避免频繁的内存分配,适合需要频繁拼接字符串的场景。

同系列:

上一篇:【Go每日一练】猜数字游戏

相关推荐
聚美智数5 小时前
智能结构化识别-图片结构解析-图像结构化解析-照片结构化解析
android·java·数据库
十年Java程序媛5 小时前
Java枚举Enum完整教程|替代静态常量,开发与面试要点
java·开发语言·spring boot·后端·面试
我是人✓5 小时前
SpringBoot静态资源映射揭秘
java·spring boot·后端
lpfasd1236 小时前
node-sass 停止维护!老项目迁移 Dart Sass 完整教程
前端·rust·sass
土豆.exe6 小时前
nf_tables 的 verdict 被读了两次:一个十年未闭合的位域错配
java·数据库·网络安全·缓存
小坏讲微服务7 小时前
刚发布一个月的JDK 27,为什么我建议你立刻升级?
java·开发语言·spring boot·spring·架构·求职招聘·springboot4
kunicoding7 小时前
多线程编程核心概念详解:从线程基础到并发安全
java·jvm·安全
snow@li8 小时前
SpringBoot:核心注解全景梳理 / @xxx 叫“注解”(Annotation)
java·spring
devilnumber8 小时前
避坑_IDEA 提取方法(Extract Method)工具
java·ide·intellij-idea
鬼手点金8 小时前
Agent 的学习机制:后训练、上下文学习与外部化学习
java·人工智能·git·学习·自动化·nanogpt