/images/avatar.jpg

派大星的独白

Go 数据结构: map 的键类型约束

结论 键类型不能是以下几种: function map slice 实际类型为function或map或slice的interface{} 元素类型为function或map或slice的array 元素类型包含function或map或slice的struct 原因 在 Go 语言规范的Map Types部分(原文链接)中规定,在键的值之间必须可以使用操作符==和!=,即键的值之间可进行判等操作。 function, map, slice这三种类型无法进行判等操作 interface{}类型的实际类型如果为上述三者也无法判等 array类型若要支持相互比较则要求它的元素类型可相互比较 struct类型同理 深层原因 为什么 Go 语言规范要求map的键的值之间可进行判等操作呢? Go 语言的map类型是一个哈希表的特定实现,每新增一个键-元素对,哈希表便会对键的值进行哈希,而后将键的哈希值和真正的键-元素对进行存储。 而当进行查找时,Go 语言会用被查找键的哈希值与已有哈希值逐个对比,如果没有相等的,就会立刻返回结果。如果有相等的,那就需要再用键值本身去对比一次。 为什么还要对比? 因为再厉害的哈希算法,都存在哈希碰撞的可能。所以即使哈希值一样,键值也不一定一样。 如果键类型的值之间无法判断相等,那么当发生哈希碰撞时则无法查找到真正所需的键-元素对了。 只有键的哈希值和键值都相等,才能说明找到了所需的键-元素对。 博客更新地址 微信公众号:派大星的独白 个人站点:https://songmingyao.com

Ubuntu 忘记密码后进入单用户模式强制修改密码

Ubuntu 忘记密码后进入单用户模式强制修改密码 环境:Ubuntu 16.04 昨晚心血来潮,看到 Ubuntu 终端里面的用户名,觉得有点长,就试着想改下,于是Google了下,并点开了第一篇文章,成功掉坑,重启 Ubuntu 后登陆页面输入密码一直显示输入错误,后来花了几个小时去搜索解决方案,良莠不齐,综合了一下,成功解决,现分享如下: 系统版本:Ubuntu 16.04,其它版本类似。 第一步 重启 Ubuntu ,并长按shift键,进入grub菜单,上下键选择Ubuntu高级选项 第二步 上下键选择recovery mode,不要按回车,按’e’键来编辑启动项 第三步 执行完第二步之后,你会见到以下界面 使用上下键,拖到最下面,找到图上红框的部分,即ro recovery nomodeset,将之替换为rw single init=/bin/bash,如果ro recovery nomodeset后面还有内容,全部删掉(删到行尾,下面两行别删),改完效果如下: 第四步 修改完成后,按Ctrl+x或F10进行引导,引导一会后会进入单用户模式,如下图: 此时输入命令 1 2 passwd username # 修改用户名为username的密码,username处替换为你的用户名 passwd # 后面什么都不加即为修改root的密码 重复输入两遍新密码之后,重启系统即可。 第五步 这个教训告诉我们,对自己不了解的系统文件修改之前,务必创建快照! 博客更新地址 微信公众号:派大星的独白 个人站点:https://songmingyao.com

git常见问题

git常见问题 环境:Ubuntu 16.04 使用Git经常会遇到奇奇怪怪的问题,现将我遇到的一些问题汇总如下,不定期更新。 · 无法推送引用 提示信息: 1 2 3 4 5 error: 无法推送一些引用到 'git@github.com:XXXXXX' 提示:更新被拒绝,因为远程仓库包含您本地尚不存在的提交。这通常是因为另外 提示:一个仓库已向该引用进行了推送。再次推送前,您可能需要先整合远程变更 提示:(如 'git pull ...')。 提示:详见 'git push --help' 中的 'Note about fast-forwards' 小节。 解决方案: 执行以下代码,强制更新 1 git push -u origin +master​ · 每次push时都提示输入github用户名和密码 提示信息 1 2 Username for https://XXXXXX Password for https://XXXXXX 解决方案 因为关联远程库的时候,选择的是https协议,换成ssh方式就不会出现这个问题了,具体代码如下: 1 2 3 git remote rm origin git remote add origin git@github.

Ubuntu 修改用户的默认目录

Ubuntu 修改用户的默认目录 环境:Ubuntu 16.04 Ubuntu 系统中,每次打开终端,就会进入系统默认的用户目录/home/username,有时候我们想要修改用户默认目录,以更快速地进入项目进行操作,这时候我们就需要通过以下方法来修改用户默认目录。 第一步 执行以下代码,修改passwd配置文件 1 sudo vi /etc/passwd 第二步 找到用户所在行,vim是用:/你的用户名来快速查找,找到所在行类似下面这种: 1 smy:x:1000:1000:Shelming.Song:/home/smy:/bin/bash 将其中的/home/smy改成你想要修改成的目录(采用绝对路径),如/home/smy/Desktop/python,其余内容都别改,保存后关闭。 第三步 关闭终端,重新打开,就自动进入你修改的目录了。 博客更新地址 微信公众号:派大星的独白 个人站点:https://songmingyao.com

依据TFTP协议的服务端和客户端

依据TFTP协议的服务端和客户端 今天写了下依据TFTP协议的服务端和客户端,端口号设置为2048。 实现功能: 可让服务端客户端搭配使用实现上传下载功能 可在服务端记录log日志 客户端可单独与Windows上的TFTP程序完成文件传输 待完善: 服务端无退出功能,不退出的话端口不能释放 代码均尚未捕获异常 服务端文件列表未实时更新 服务端log日志未设保护 未按照MD5校验值来判断文件 服务端代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 from socket import * import struct import os import time def send_file(): global log '发送文件' if file_name in file_list: # 检测服务端是否存在客户端要下载的文件 f = open('.