zoukankan      html  css  js  c++  java
  • Golang实现一个密码生成器

    小地鼠防止有人偷他的果实,在家里上了一把锁。这个锁怎么来的呢?请往下看。。

    package main
    
    import (
        "flag"
        "fmt"
        "math/rand"
        "time"
    )
    
    var (
        length  int
        charset string
    )
    
    const (
        NUmStr  = "0123456789"
        CharStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
        SpecStr = "+=-@#~,.[]()!%^*$"
    )
    
    //解析参数
    func parseArgs() {
        //需要接受指针,就传递地址,&
        flag.IntVar(&length, "l", 16, "-l 生成密码的长度")
        flag.StringVar(&charset, "t", "num",
            //反引号以原样输出
            `-t 制定密码生成的字符集,
            num:只使用数字[0-9],
            char:只使用英文字母[a-zA-Z],
            mix:使用数字和字母,
            advance:使用数字、字母以及特殊字符`)
        flag.Parse()
    }
    
    //检测字符串中的空格
    func test1() {
        for i := 0; i < len(CharStr); i++ {
            if CharStr[i] != ' ' {
                fmt.Printf("%c", CharStr[i])
            }
        }
    }
    
    func generatePasswd() string {
        //初始化密码切片
        var passwd []byte = make([]byte, length, length)
        //源字符串
        var sourceStr string
        //判断字符类型,如果是数字
        if charset == "num" {
            sourceStr = NUmStr
            //如果选的是字符
        } else if charset == "char" {
            sourceStr = charset
            //如果选的是混合模式
        } else if charset == "mix" {
            sourceStr = fmt.Sprintf("%s%s", NUmStr, CharStr)
            //如果选的是高级模式
        } else if charset == "advance" {
            sourceStr = fmt.Sprintf("%s%s%s", NUmStr, CharStr, SpecStr)
        } else {
            sourceStr = NUmStr
        }
        fmt.Println("source:", sourceStr)
    
        //遍历,生成一个随机index索引,
        for i := 0; i < length; i++ {
            index := rand.Intn(len(sourceStr))
            passwd[i] = sourceStr[index]
        }
        return string(passwd)
    }
    
    func main() {
        //随机种子
        rand.Seed(time.Now().UnixNano())
        parseArgs()
        fmt.Printf("length:%d charset:%s
    ", length, charset)
        //test1()
        passwd := generatePasswd()
        fmt.Println(passwd)
        fmt.Printf("length:%d charset:%s
    ", length, charset)
    }

    效果呢?

  • 相关阅读:
    派生类的构造函数
    继承和派生
    自增自减运算符的重载(强制类型转换运算符重载)
    流插入和流提取运算符的重载
    动态数组类的设计
    函数的返回值
    赋值运算符的重载
    运算符重载
    常量对象函数引用和参数传递
    理解ASP.NET MVC的路由系统
  • 原文地址:https://www.cnblogs.com/pyyu/p/8664255.html
Copyright © 2011-2022 走看看