![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
golang
风格色
这个作者很懒,什么都没留下…
展开
-
golang 排序算法
排序算法的比较待排序list lst = [28, 35, 46, 32, 64, 21]直接插入排序排序思想: 假设第一个数是排序好的序列,不断从后面选取一个,插入到前面排序好的序列.[28 35 | 46 32 64 21][28 35 46 | 32 64 21][28 32 35 46 | 64 21][28 32 35原创 2017-06-14 20:16:45 · 316 阅读 · 0 评论 -
Caddy 源码阅读
CaddyCaddy 是一个go编写的web server。 类似于nginx。官网上是这么介绍的:Caddy is the HTTP/2 web server with automatic HTTPS. (说实话官网v1版本的介绍并不怎么清楚,反而是v2版本的介绍更明确)Caddy的作用Caddy simplifies your infrastructure. It takes car...原创 2020-03-01 22:22:35 · 1447 阅读 · 0 评论 -
golang 实现简单DNS服务器
简单的DNS服务器提供一个简单的可以查询域名和反向查询的DNS服务器。dig命令主要用来从 DNS 域名服务器查询主机地址信息。查找www.baidu.com的ip (A记录):命令:dig @127.0.0.1 www.baidu.com根据ip查找对应域名 (PTR记录):命令:dig @127.0.0.1 -x 220.181.38.150源码 :package mai...原创 2020-03-01 19:18:22 · 3927 阅读 · 0 评论 -
僵尸进程和孤儿进程 --golang实现
僵尸进程一个进程使用fork创建子进程,如果子进程退出,而父进程没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中,这种进程称为僵尸进程。孤儿进程一个父进程退出,而它的一个或多个子进程还在运行,那么这些子进程将称为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对他们完成状态收集工作。原创 2017-12-15 21:39:14 · 1519 阅读 · 0 评论 -
golang 文件服务器-命令行工具
背景经常进入容器操作,有时候会有在容器之间或在容器和本机之间传输文件的需求。于是用golang写了一个命令行工具,可以把当前目录启动为文件服务器的根目录。需要下载时就可以使用curl命令下载相应文件。fileserver项目地址: https://github.com/FengGeSe/fileserver使用帮助$ fileserver -h文件服务器Usage: fil...原创 2020-02-18 10:47:12 · 406 阅读 · 0 评论 -
golang 压测工具vegeta改造-支持自定义压测任务
背景之前在公司做压测工作的时候,使用了web压测工具vegeta。后续又接到过dns的性能压测、redis的性能压测等任务。http的压测工具vegeta并不能满足需求了。于是模仿vegeta的lib包写了attacker 这个项目。Attackerattacker是一个支持自定义任务的项目。 attacker模仿了vegeta的压测逻辑,支持自定义任务。可以按照指定的压测周期,压测频率执行...原创 2020-02-18 10:38:18 · 1036 阅读 · 0 评论 -
golang 客户端/服务端(C/S) 模式的命令行工具(cobra)
背景做项目测试的时候,为了方便自己,用cobra写了一个测试用的命令行工具。比如帮我发一个http请求到被测服务上去, 拿到相应参数做校验和其他二次处理。 再比如连接数据库拿到相关记录,并人性化显示出来。这个命令行的测试工具节省了很多手工操作的成本,于是我推广给开发用,减少他们自测的成本。但是这个命令行工具更新迭代的很快,每次都得重新给开发新的命令。于是我将原本客户端的功能收敛到服务端,客户端...原创 2020-02-14 12:12:36 · 681 阅读 · 0 评论 -
golang日志框架zap
zap是uber开源的Go高性能日志库封装package logimport ( "os" "go.uber.org/zap" "go.uber.org/zap/zapcore")var ( logger *zap.Logger automicLevel = zap.NewAtomicLevelAt(zapcore.InfoLevel))func ini...原创 2019-12-10 18:34:52 · 1704 阅读 · 0 评论 -
docker 本地搭建mysql 5.7 开发环境
docker-compose.ymlversion: '3'services: mysql: image: mysql:5.7 container_name: mysql restart: always ports: - 0.0.0.0:3306:3306 environment: - MYSQL_ROOT_PASSWORD=...原创 2019-12-01 12:35:48 · 300 阅读 · 0 评论 -
golang 项目 Makefile demo
因为看到很多golang项目都使用Makefile来完成程序的编译运行,这里我也百度了一些博客,从别人写的Makefile中摘取了我经常用到的功能。整理记录如下:功能list:help help命令使用sed命令从Makefile中获取命令列表和注释build 通过ldflags蚕食编译时注入版本信息(golang 版本 项目版本 git commit 构件时间)build-...原创 2019-11-30 21:52:40 · 1180 阅读 · 0 评论 -
【golang】defer
deferdefer简介在Go语言中,可以使用关键字defer向函数注册退出调用,即主函数退出时,defer后的函数才被调用。defer语句的作用是不管程序是否出现异常,均在函数退出时自动执行相关代码。多个defer函数按照先进后出的顺序执行。defer特点参数的实时解析func test() { i := 0 defer fmt.Println(i) //输出0,...原创 2019-07-10 21:20:28 · 271 阅读 · 0 评论 -
【golang】字符串
字符串字符串底层是字节数组。遍历一个字符串。想当于遍历一个byte数组。如果字符串全都是英文字母的话,遍历字节数组也没啥问题。当字符串里含有中文、日文、表情符等内容的话,按照字节数组的遍历方式没有太大意义。golang中字符串的遍历有两种方式:for i byte=uintfunc main() { s := "你好hello" fmt.Println("len:", len(...原创 2019-07-13 16:26:15 · 213 阅读 · 0 评论 -
【golang】map
Mapmap[string]struct{}func main() { m := map[string]struct { Name string Age int }{ "wss": {"wss", 24}, } m["wss"].Age = 10 // Error: cannot assign to str...原创 2019-07-15 14:55:43 · 422 阅读 · 0 评论 -
【golang】make & new
newnew用来初始化变量并分配内存。它的第一个参数是一个类型,不是一个值,它的返回值是一个指向新分配类型零值的指针。channel, func, map, slice等零值是nil。func main() { m := *new(map[int]int) // new返回指针 m[1] = 2 fmt.Println(m)}// Output:...原创 2019-07-18 08:57:48 · 2270 阅读 · 1 评论 -
【golang】验证map&slice并发不安全
并发安全golang的slice和map是常用的数据结构,为了降低性能损耗,slice和map并没有相应的设计来保证并发安全。slice验证非并发安全起n个goroutine并发的超slice中append数据,n个goroutine都结束后,打印slice的长度。package mainimport ( "fmt" "sync")func main() {...原创 2019-07-16 15:31:42 · 1562 阅读 · 0 评论 -
【golang】优雅且安全的并发写slice或map
并发写 slice和map是不安全的【golang面试准备】验证map&slice并发不安全怎么能高并发写入?slice&map并发不安全,都是在写的时候发生的,那么就要保证同一时间只有一个gorutine来写这个slice或者map。有两种方式实现:加锁方式:n个goroutine都有可能执行写入操作,保证同一时间只能有一个在执行写操作。 加锁操作简单,适用于性能...原创 2019-07-18 18:52:54 · 10886 阅读 · 1 评论 -
【源码解析】压测工具vegeta
序言之前做压测的时候,找到的一个go语言的http压测工具vegeta(贝吉塔)。 github地址:https://github.com/tsenart/vegeta 。原创 2019-08-19 16:21:06 · 2708 阅读 · 0 评论 -
基于go-kit开发的demo项目
go-kit demo基于go-kit的一个demo工程。项目地址: https://github.com/FengGeSe/demogo-kit: A standard library for microservices.目标支持多种协议和数据传输格式开闭原则中间件功能 pb+grpc json+http error处理 路由TODO dao层 容器部署...原创 2019-08-26 11:54:39 · 3880 阅读 · 0 评论 -
Golang -- 字符串
字符串字符串是一组的字节(byte)序列, 它是不可变的, 通常时utf-8编码. 字符串的零值是”” 不是nil.可以len(), 不可以cap()package mainimport ( "fmt")func main() { s := "abc" fmt.Println(len(s)) // 结果: 3 // 错误: in...原创 2017-06-30 18:25:06 · 544 阅读 · 0 评论 -
golang - 验证互斥锁sync.Mutex是否生效的【错误】案例
package mainimport ( "fmt" "sync")var ( count int countGuard sync.Mutex wg sync.WaitGroup m = map[int]int{})func main() { wg.Add(1000) for i := 0; i < 1000; ...原创 2019-07-03 07:42:00 · 978 阅读 · 0 评论 -
golang 爬楼梯算法(递归&非递归)
题目:递归方法递归实现的可读性高,实现简单。func ClimbStairs(n int) int { var count int = 0 Climb(0, n, &count) return count}// current 当前爬的楼梯数// n 目标楼梯数// count 计数func Climb( current, n int, count *int) {...原创 2019-05-13 21:05:21 · 973 阅读 · 0 评论 -
golang 实现简单的栈
第一种 基于[]inttype Stack []int// pushfunc (s *Stack) Push(a int) { *s = append(*s, a)}// popfunc (s *Stack) Pop() int { a := (*s)[len(*s)-1] *s = (*s)[:len(*s)-1] return a}// lenfunc (s *...原创 2019-05-13 20:56:46 · 486 阅读 · 0 评论 -
golang -- slice元素去重
合并两个整型切片,返回没有重复元素的切片,有两种去重策略1. 通过双重循环来过滤重复元素(时间换空间)// 通过两重循环过滤重复元素func RemoveRepByLoop(slc []int) []int { result := []int{} // 存放结果 for i := range slc{ flag := true for j := r原创 2017-08-19 10:59:18 · 46093 阅读 · 2 评论 -
【golang】goroutine
介绍goroutine是Go并行设计的核心。goroutine说到底其实就是线程,但是它比线程更小,十几个goroutine可能体现在底层就是五六个线程,Go语言内部帮你实现了这些goroutine之间的内存共享。执行goroutine只需极少的栈内存(大概是4~5KB),当然会根据相应的数据伸缩。也正因为如此,可同时运行成千上万个并发任务。goroutine比thread更易用、更高效、更轻便。原创 2017-07-31 10:30:06 · 1240 阅读 · 0 评论 -
Golang -- 字典
字典定义和初始化作为无序键值对集合,字典要求key必须是支持相等运算符 ( == , != ) 的数据类型, 如 数字, 字符串, 指针, 数组, 结构体 以及对应的接口类型. 字典是引用类型, 使用make函数或初始化表达语句来创建.package mainimport ( "fmt")func main() { a := make(map[int]string) // 字典原创 2017-07-02 19:06:54 · 2283 阅读 · 0 评论 -
Golang -- 切片
切片切片( slice )本身并非是动态数组或数组指针.它内部通过引用底层数组,设定相关属性将操作限制在指定数组上. 有三个属性: 底层数组指针, 长度, 容量. 长度指的是当前切片的长度,也就是底层数组已经存储的长度. 容量是切片可以使用的最大长度, 不一定是底层数组的长度.定义和初始化切片可以从已存在的数组上得到, 也可以直接创建. 因为切片是引用类型,直接创建时不会分配底层数组,所以原创 2017-07-02 18:36:22 · 231 阅读 · 0 评论 -
尾递归
尾递归函数调用自身,称为递归。如果尾调用自身,就称为尾递归。递归非常耗费内存,因为需要同时保存成千上百个调用帧,很容易发生“栈溢出”错误(stack overflow)。但对于尾递归来说,由于只存在一个调用帧,所以永远不会发生“栈溢出”错误。对比package mainimport ( "fmt")// 存在尾递归func fibonacci(n int) int { if n原创 2017-07-11 15:02:12 · 1846 阅读 · 0 评论 -
Golang -- 互斥锁
互斥锁 sync.Mutexsync.Mutex 只有两个公开的指针方法 Lock() 和 Unlock(). Lock() 用于锁定当前互斥量. Unlock() 用于对互斥量解锁.如果锁定了一个已锁定的互斥锁,则进行重复加锁的goroutine将会阻塞. 当互斥锁解锁后,阻塞的goroutine会唤醒. 演示程序:package mainimport ( "fmt" "原创 2017-06-03 21:07:05 · 1442 阅读 · 0 评论 -
Golang -- goroutine实例(乒乓球双打比赛)
题目:有四个选手, A1和A2为一个队, B1和B2为另一个队. A1首先发球(启动球), 然后B1, A2, B2将最后发球. 每一轮每个选手发2个球.选手不改变他们的位置. 比赛期间, 双方选手必须轮流发球,并且在同一个队伍的两个选手可以竞争发球.当轮到某个选手时, 他/她可以调用一个叫做shot(rate) 的随机函数来模拟比赛,在给定概率rate以内,该函数返回 “in”, 否则返回原创 2017-06-04 10:25:53 · 1370 阅读 · 0 评论 -
Golang -- 数组
数组声明和初始化声明数组后, 使用对应类型的零值来初始化数组. int的零值是0 string的零值是 “” (注意不是nil)package mainimport ( "fmt")var a1 [3]int // 声明一个长度3的整型数组func main() { fmt.Println(a1) // 结果是 [0 0 0] a2 := [2]string{} //原创 2017-06-04 22:46:12 · 955 阅读 · 0 评论 -
golang 实现华容道
游戏介绍华容道游戏共有10个棋子, 在5*4的棋盘上. 其中曹操占2*2格, 张飞,关羽, 赵云, 黄忠, 马超 占2*1格, 这些棋子有横向和竖向的区别. 4个卒各占1格. 目标: 将曹操这枚棋子移动到棋盘正下方. 棋子不能横跨棋子,每次只移动一格.设计思路因为没有图形界面, 于是将每个棋子和移动方向编号. * 棋子编号: 0.曹操 1.张飞 2.关羽 3.赵云 4.黄忠 5.马超 6.兵 7原创 2017-09-07 12:47:07 · 541 阅读 · 0 评论 -
生成器 python&golang
生成器编程中常遇到这样的问题,要生成一个大的列表或把一个大文件读入内存. 如果一次性把大的列表或数组生成出来,或把文件读入内存中,将十分消耗内存资源. 现在有这样一个问题, 要生成一千万个随机整数, 并求和. 解决思路有两种,第一种: 先生成一千万个随机整数,然后遍历求和. 第二种: 每生成一个随机整数,求一次和. 显然是第二种方式比较省内存. 使用生成器就可以完美的实现.python的生成原创 2017-09-03 10:11:40 · 1054 阅读 · 0 评论 -
为什么选择了golang
学习经历大一两个学期来学习C++复杂而又全面的语法。重载、多继承、虚函数、纯虚函数、拷贝函数、构造函数、析构函数、友元函数、内联函数、模板。。。大二的时候学习了java, java的语法比C++少很多。垃圾回收不用开发人员考虑。用面向对象的思想来描述和解决问题。写代码的时候比C++简单了,但是感觉还是有些繁琐。面向对象并不是万能的,只能通过设计模式来弥补。大三的时候接触到了python. ...原创 2019-04-19 16:31:44 · 405 阅读 · 0 评论 -
golang reflect 判断是否为零值
在使用reflect的过程中,想让结构体的值根据tag中default的值来进行赋值操作。如果这个field本身有值,就不赋予默认值,如果是零值,则赋予默认值。没办法判断这个值有没有被赋值过,但可以判断是否是零值。原文地址https://studygolang.com/articles/12029?fr=sidebar...转载 2019-03-25 18:35:11 · 4644 阅读 · 0 评论 -
golang 超好用 json 解析包
介绍当遇到接收的json的结构不明确的时候,每次想获取json里面的字段,都要不断断言字段的类型,使用起来特别不方便。这里推荐一个第三方包https://github.com/tidwall/gjson使用go get -u github.com/tidwall/gjsonpackage mainimport "github.com/tidwall/gjson"const j...转载 2019-02-18 17:26:34 · 7706 阅读 · 2 评论 -
golang 错误: cannot use XXX literal (type XXX) as type XXX in assignment:XXX does not implement XXX
出错代码如下:package mainimport ( "fmt")type Speaker interface { Hello()}type User struct { Name string Age int}func (this *User) Hello() { fmt.Println("hello my name is", t...原创 2019-01-17 11:05:05 · 26193 阅读 · 0 评论 -
Go 实现 Google的Authenticator app的计算动态码
从Github代码改的原地址: https://github.com/robbiev/two-factor-authpackage mainimport ( "crypto/hmac" "crypto/sha1" "encoding/base32" "fmt" "os" "strings" "time&quo原创 2018-03-21 10:21:11 · 3038 阅读 · 1 评论 -
Go 语言概述 (下)
Go 语言概述 (下)函数定义函数main.gopackage mainimport ( "fmt")func main() { fmt.Println(add(1, 2))}func add(a int, b int) (int) { return a + b}注: 前几个函数参数的类型可以省略, 最后一个不行. fun原创 2017-04-27 10:42:01 · 436 阅读 · 0 评论 -
Go 语言概述 ( 上 )
Go 语言概述 (上)1. Hello World 程序main.gopackage mainfunc main() { print("Hello World")}运行结果: 导入标准库 fmt (format 包含有格式化I/O函数)main.gopackage mainimport "fmt"func main() {原创 2017-04-27 09:21:20 · 384 阅读 · 0 评论 -
Golang -- 函数
Golang逃逸分析介绍逃逸分析的概念,go怎么开启逃逸分析的log。 以下资料来自互联网,有错误之处,请一定告之。 sheepbao 2017.06.10 什么是逃逸分析 wiki上的定义In compiler optimization, escape analysis is a method for determining the dynamic scope of pointers -原创 2017-06-30 14:38:05 · 3108 阅读 · 0 评论