May 8, 2020 字数:
109
·
阅读:
1 分钟
·
访问:
-
Golang 系列进阶文章 Golang 系列文章 来源: 飞雪无情 Go包管理 Go开发工具 Go Doc 文档 Go 数组 Go 切片 Go Map Go 类型 Go 函数方法 Go 接口 Go 嵌入类型 Go 标志符可见性 Go goroutine Go 并发资源竞争 Go 通道 Go 并发示例-Runner Go 并发示例-Pool Go 读写锁 Go log 日志 Go Writer 和 Reader Go Context Go 单元测试 Go 基准测试 Go 调试 Go 反射 Go Struct Tag Go unsafe 包之内存布局 Go unsafe Pointer Go 后记 Golang 每日一库 Golang 每日一库 来源 darjun flag go-flags go-homedir go-ini cobra viper fsnotify cast log logrus godotenv carbon email dig gojsonq message-bus watermill wire mergo copier jennifer go-cmp buntdb gjson sjson jj govaluate validator gopsutil gentleman plot go-app zap zerolog nutsdb sqlcApril 28, 2020 字数:
222
·
阅读:
2 分钟
·
访问:
-
分析 项目四个Go文件, 每个文件仅描述一件事, 思路非常清淅, 故此学习并总结一下里面的精华.
定义Options结构体接受外部定义的配置 定义入口文件, 整个项目的入口, 并返回一个下一层处理的结构体 定义逻辑结构体, 下一层结构体担负着处理逻辑的任务,并返回处理结构的结构体. 定义收尾结构体, 将上一层的处理的结果进行进一步分析,最终展现给用户 入口文件 Goz.go 只初使化了Request结构体. 可以定义初使配置Options, 整个项目所需的配置都在Options结构里 options.go#L6 // NewClient new request object func NewClient(opts ...Options) *Request { req := &Request{} if len(opts) > 0 { req.opts = opts[0] } return req } 配置文件 Options.go 定义了整个项目需要的外部参数 变量首字母都大写 options.go#L6 // Options object type Options struct { BaseURI string Timeout float32 timeout time.Duration Query interface{} Headers map[string]interface{} Cookies interface{} FormParams map[string]interface{} JSON interface{} Proxy string } 核心处理文件 Request.April 24, 2020 字数:
104
·
阅读:
1 分钟
·
访问:
-
为什么使用集成服务呢 我们向github提交代码时, 我们得保证我们的代码是能运行的, 我们会写测试用例, 保证我们的代码功能能正常使用.常见大神们的开源项目都一个绿色图标"build|passing 表示构建OK
如何使用Travis服务呢 打开这个网站 https://travis-ci.org/ 点击登陆, 使用github登陆.目前似也只支持github
1. 添加仓库 2. 开启集成 3. 项目根目录添加.travis.yml文件 cd ~/github_webhook
touch .travis.yml 4. 编写.travis.yml文件 language: go 表示当前仓库是go语言 go - 1.14 表示使用golang版本 sudo:required 表示需要root权限 os 表示使用运行环境, linux, osx是苹果系统 install 安装需要集成的必要软件 script 代表运行的脚本 以下是个测试空命令文件, 可以拿测试.看看能不能运行
language: go
go:
- 1.14
sudo: required
os:
- linux
- osx
install:
- echo "install"
script:
- echo "script" 以下是一个正式的集成测试文件
language: go
go:
- 1.14
sudo: required
os:
- linux
- osx
install:
- echo "install"
- go get -u github.April 24, 2020 字数:
89
·
阅读:
1 分钟
·
访问:
-
原理 当本地git push origin master向Github远程仓库提交代码时,可以通过配置github自带webhook向服务器发送请求, 利用github-webhook工具在服务器端接到请求后,调用自定义shell脚本来实现自动构建 github-webhook 文档 更多详情文档 https://github.com/yezihack/github-webhook 使用github-webhook 源码: https://github.com/yezihack/github-webhook 别忘记点个小星星哦.
1. 下载github-webhook工具 https://github.com/yezihack/github-webhook/releases
github release下载太慢, 试试这个
wget https://cdn.jsdelivr.net/gh/yezihack/assets/github-webhook1.4.1.linux-amd64.tar.gz 2. 运行github-webhook 安装
tar -zxvf github-webhook1.4.1.linux-amd64.tar.gz
cp github-webhook /usr/bin/
chmod u+x /usr/bin/github-webhook 运行
默认端口: 2020 有效访问地址: http://ip:2020/web-hook -b 是shell脚本路径参数 -s 是github webhook设置的密码 # 非后台运行
github-webhook -b [shell脚本路径] -s [github webhook设置的密码]
# 后台运行
nohup github-webhook -b [shell脚本路径] -s [github webhook设置的密码] & # 定向日志输出
nohup github-webhook -b ~/sh/hugo2www.sh -s qweqwe >> ~/logs/webhook.April 17, 2020 字数:
80
·
阅读:
1 分钟
·
访问:
-
(图片来自网络,有侵权,联系我删除)
当我们做命令行工具时, 遇到用户需要输入密码时, 常规处理是当字符串显示输入,这样并不是很好.应该像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.April 14, 2020 字数:
94
·
阅读:
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.March 14, 2020 字数:
231
·
阅读:
2 分钟
·
访问:
-
做开发的话,如果是从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.March 13, 2020 字数:
142
·
阅读:
1 分钟
·
访问:
-
什么是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.February 24, 2020 字数:
233
·
阅读:
2 分钟
·
访问:
-
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则替换掉.February 24, 2020 字数:
594
·
阅读:
3 分钟
·
访问:
-
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{}
}
//插入头部操作.