(图片来自网络,有侵权,联系我删除) 当我们做命令行工具时, 遇到用户需要输入密码时, 常规处理是当字符串显示输入,这样并不是很好.应该像mysqld工具一样,输入密码时,以星号代替.对敏感数据进行脱敏处理. 今天要介绍一个golang这方面的包github.com/howeyc/gopass 代码实例使用 1. 当输入密码时,不显示任何信息 func GetPasswd() { fmt.Printf("1.请输入密码:") pass, err := gopass.GetPasswd() if err != nil { log.Fatalln(err) return } fmt.Println("您输入的密码是:", string(pass)) } 2. 当输入密码时,以星号*代替你输入的字符 func GetPasswdMasked() { fmt.Printf("2.请输入密码:") pass, err := gopass.GetPasswdMasked() if err != nil { log.Fatalln(err) return } fmt.Println("您输入的密码是:", string(pass)) } 3.你输入密码时,以星号*代替你输入的字符 func GetPasswdPrompt() { pass, err := gopass.GetPasswdPrompt("3.请输入密码:", true, os.Stdin, os.Stdout) if err != nil { log.Fatalln(err) return } fmt.Println("您输入的密码是:", string(pass)) } 效果 1.
leetcode: 16.11 https://leetcode-cn.com/problems/diving-board-lcci 题目 你正在使用一堆木板建造跳水板。有两种类型的木板,其中长度较短的木板长度为shorter,长度较长的木板长度为longer。你必须正好使用k块木板。编写一个方法,生成跳水板所有可能的长度。 返回的长度需要从小到大排列。 思路 题目的意思就是求一个k的组合, 利用给出的长短木板进行组合. 边界条件考虑: 如果k = 0, 也就是不需要组合.返回空数组. 如果长短目录都相等, 最长的目录组就是 k * 长度(shorter, longer) 代码求解 func LivingBoard(shorter, longer, k int) []int { if k == 0 { // 也就是不需要组合.返回空数组. return nil } if shorter == longer { // 如果长短目录都相等, 最长的目录组就是 k * 长度(shorter, longer) return []int{shorter * k} } group := make([]int, k+1) // 为什么k+1, 因为在组合中我可以使用全是长木板也可以使用全是短木板. for i := 0; i < k+1; i++ { fmt.
做开发的话,如果是从mac或linux转为window的用户,有很多不习惯需要一些使用linux的命令 而window虽然有powershell,还是不够尽兴,如果有一台linux系统又运行在window上,而又不是 那种笨重的虚拟机,那该多好.而win10就满足了你的需求.win10内置linux子系统,让你操作如飞的感觉. win10安装linux子系统 第一步: 启用或关闭Windows功能 开始->设置->应用->找到"程序和功能"(一般在右边位置")->找到"启用或关闭Windows功能" 点击弹出窗口后, 向下拉找到"适用于Linux的Windows子系统"选项. 勾选后,确定. 重新电脑. 第二步: 安装Ubuntu子系统 在Microsoft Store搜索ubuntu,点击免费安装. 下载完, 在开始程序中找到.点击进行初使化, 数分钟后安装完毕. 第三步: 设置新帐号 系统会 提示你设置一个用户名,然后再设置密码即可.正常使用ubuntu. 此时你还不是root帐号.安装东西需要使用root帐号 第四步: 初使root密码 sudo passwd root #回车 输入新密码 确认密码 # 切换root su root 更换ubuntu软件源 切换root帐号 su root #回车 备份一下之前的源 cp /etc/apt/sources.list /etc/apt/sources.list.backup 编辑sources.list vim /etc/apt/source.list #按ecs,一直按d按键清空源,然后再i键 复制下面的aliyun源 aliyun源 # 1.阿里云源 deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse deb http://mirrors.
什么是YAPI 写接口文档的软件, 支持RESTful, Mock假数据, 团队管理协作,非常方便好用.良心之作 内网安装 参考网上的教程吧. mac: https://www.cnblogs.com/yehuisir/p/12190446.html linux; https://www.jianshu.com/p/6c269d00bb38 安装cross-request插件 可以在Yapi运行假数据. 蓝凑云:https://freemt.lanzous.com/i0pDFfo582j 使用mock假数据 { "status": 200,//状态码 "msg": "success",//提示信息 "data": { "page": 1, //当前页 "page_count": 10, //一共多少页 "total_ount": 100, //数据数量 "list|5-18":[ //生成5到18个子序列 { "id":"@increment", //生成递增主键ID "name":"@ctitle(4,6)",//生成中文字符4到6个之间 "uuid":"@uuid",//生成uuid "created_at":"@date('yyyy-MM-dd')",//生成时期格式 "status":"@pick(['未认证','已认证','已拒绝','已冻结'])"//从数组里随机选择一项. } ] } } mock常用规则 字符串 @cname() 生成名字 @url 生成url @domain() 生成域名 @email() 生成邮箱 @region() 生成地区, 如华中,华北 @province() 生成省份,如北京,山东,湖南省 @city() 生成城市, 如玉林市,拉萨, @city(true) @county() 生成区域 , 龙亭区 @county(true) 生成完整的区域, 如山西省 忻州市 神池县 @pick([“a”, “e”, “i”, “o”, “u”]) 选择一个元素 @title() 生成标头 @word(),@word(3),@word(3, 5)生成字母,可以指定大小,也可以是范围。 @sentence() @sentence(3) @sentence(3, 5) 生成单词数量 同上 @cparagraph(),@cparagraph(2), @cparagraph(2,5) 生成句子 同上 @csentence 中文句子 日期 @date(“yyyy-MM-dd”) 生成日期, “2013-05-07” @date(“yyyy-MM-dd HH:mm:ss”) “2020-01-02 17:15:04” 数字 @guid() 生成uuid @id() 生成ID @id(10) 生成10位的ID @increment() 递增1,2,3 @increment(100) 递增步长100 @natural(1,100000) 生成自然数 @zip() 生成区号 @integer(1, 10) 生成数字, @integer , @integer(5) 其它 @boolean() 生成true, false @rgba() 生成RBG颜色值 如"rgb(129, 121, 242)" @color() 生成颜色值, 如"#f2798f" 参考 github https://github.
leetcode 53. 最大子序和 simple 题目 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 示例: 输入: [-2,1,-3,4,-1,2,1,-5,4], 输出: 6 解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。 解题思路 共三种思路: 暴力求解;贪心算法,动态规划 暴力求解 数组每一种组合都查看一遍, 每个组合都与保存当前最大值的变量比较一下. //暴力求解 //Time:O(n^2), space:O(1) func MaxSubArray(nums []int) int { count := len(nums) if count == 0 { return 0 } max := 0 for i := 0; i < count; i++ { sum := 0 for j := i; j < count; j++ { sum += nums[j] //累加操作 if sum > max { //如果大于max则替换掉.
leetcode 146. LRU缓存机制 middle 题目 运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制。它应该支持以下操作: 获取数据 get 和 写入数据 put 。 获取数据 get(key) - 如果密钥 (key) 存在于缓存中,则获取密钥的值(总是正数),否则返回 -1。 写入数据 put(key, value) - 如果密钥不存在,则写入其数据值。当缓存容量达到上限时,它应该在写入新数据之前删除最近最少使用的数据值,从而为新的数据值留出空间。 进阶: 你是否可以在 O(1) 时间复杂度内完成这两种操作? 解题方法 采用hash+double-linked实现LRU缓存算法机制. 先独立写个双链表, 然后引用双链表和hash实现LRU 双链表 有些多除的方法,主要为了调试使用. type Linkeder interface { AddHead(key, value int) *LinkedNode //插入头位置 Append(key, value int) *LinkedNode //追求到尾部 RemoveNode(node *LinkedNode) bool //删除指定位置的节点 RemoveTail() *LinkedNode //删除尾部的节点 Reverse() *LinkedNode //反转链表 Print() string //打印链表 PrintLink(head *LinkedNode) string } type LinkedNode struct { key int //key value int //value next *LinkedNode //next pointer prev *LinkedNode //prev pointer } type Linked struct { length int //链表长度 head *LinkedNode //链表头部节点 tail *LinkedNode //链表尾部节点 } func NewLinked() Linkeder { return &Linked{} } //插入头部操作.
leetcode 14. 最长公共前缀 simple 题目 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀,返回空字符串 “"。 输入: [“flower”,“flow”,“flight”] 输出: “fl” 输入: [“dog”,“racecar”,“car”] 输出: "” 解释: 输入不存在公共前缀。 解题思路 解法一: 挨个比较 首先要注意边界条件, 数组为空的情况 先找到数组里最短的字符串,因为题目是求最短前缀,必须先找最短的字符串 拿最短字符串与数组里每一个字符串的每一个字符进行比较. 如果不相等则截取,即获取最短前缀. 注意这里是最外层循环是最短的字符串循环, 然后里层循环是数组循环, 挨个字符串进行比较. 也就是查看所有的字符串与最短的字符串是否一致.如果出现不一致则截取返回. func LongestCommonPrefix(strs []string) string { l := len(strs) if l == 0 { //边界条件 return "" } short := strs[0] //从数组里查找到最小字符串. for i := 1; i < l; i++ { if len(short) > len(strs[i]) { //只要存在比第一个字符还短的则进行赋值操作. short = strs[i] } } //如果最短字符串长度为0则,返回空 if len(short) == 0 { //边界条件 .
感触 为了坚持学习算法, 每篇算法标题写上坚持多少天,以此鼓励自己坚持学下去. 会把自己理解的都写在代码处, 你在看代码时也方便, 为什么这一行这么写. 也是锻炼自己的文档水平. 题目 LeetCode:41题, 困难 给定一个未排序的整数数组,找出其中没有出现的最小的正整数。 示例 1: 输入: [1,2,0] 输出: 3 示例 2: 输入: [3,4,-1,1] 输出: 2 示例 3: 输入: [7,8,9,11,12] 输出: 1 要求: 你的算法的时间复杂度应为O(n),并且只能使用常数级别的空间 解法一: 利用map+for-range实现 Time: O(n), Space:O(n)不符合题目要求 //解法一: 利用map+for-range实现.时间复杂度O(n), 空间是常数O(n) // 4 ms 2.8 MB func FirstMissingPositive(nums []int) int { hash := make(map[int]struct{}, len(nums)) for i := 0; i < len(nums); i++ { hash[nums[i]] = struct{}{} } fmt.Println(hash) //1-n之间检查, 如果有缺失则是最小值. for i := 1; i <= len(nums); i++ { //从1循环到n, 包含n if _, ok := hash[i]; !
LeetCode:11题, 中等 解析题目 解析题目: 将数组想象成一个矩形, 寻找这个矩形盛最多水的大小. 决定盛水高度取决于最低的那根木板.也就是数字最小的那个值, 决定盛水最多还得取决于它的长度.也就是数组的头与尾之间的距离. 暴力求解. 对数组从小到大都查看一遍, 取最大容器的那个. //暴力求解 //Time:O(n^2), Space:O(1) func ContainerWithMostWater(height []int) int { if len(height) == 0 { return 0 } //暴力求解, 任何可能都不放过. maxArea := 0 //存放最大面积的变量. for i := 0; i < len(height); i++ { for j := i + 1; j < len(height); j++ { //获取最短板的那个数字,也就是最小值的数字 minHeight := height[i] if height[j] < minHeight { minHeight = height[j] } //获取j与i之间的差距离. distance := j - i //求面积.

参考 https://www.cyhone.com/articles/analisys-of-golang-rate/ https://www.cyhone.com/articles/analysis-of-uber-go-ratelimit/