golang projects

[toc]

一. 开发工具

1)sql2go
用于将 sql 语句转换为 golang 的 struct. 使用 ddl 语句即可。
例如对于创建表的语句: show create table xxx. 将输出的语句,直接粘贴进去就行。
http://stming.cn/tool/sql2go.html

2)toml2go
用于将编码后的 toml 文本转换问 golang 的 struct.
https://xuri.me/toml-to-go/

3)curl2go
用来将 curl 命令转化为具体的 golang 代码.
https://mholt.github.io/curl-to-go/

4)json2go
用于将 json 文本转换为 struct.
https://mholt.github.io/json-to-go/

5)mysql 转 ES 工具
http://www.ischoolbar.com/EsParser/

6)golang
模拟模板的工具,在支持泛型之前,可以考虑使用。
https://github.com/cheekybits/genny

7)查看某一个库的依赖情况,类似于 go list 功能
https://github.com/KyleBanks/depth

8)一个好用的文件压缩和解压工具,集成了 zip,tar 等多种功能,主要还有跨平台。
https://github.com/mholt/archiver

9)go 内置命令
go list 可以查看某一个包的依赖关系.
go vet 可以检查代码不符合 golang 规范的地方。

10)热编译工具
https://github.com/silenceper/gowatch

11)revive
golang 代码质量检测工具
https://github.com/mgechev/revive

12)Go Callvis
golang 的代码调用链图工具
https://github.com/TrueFurby/go-callvis

13)Realize
开发流程改进工具
https://github.com/oxequa/realize

14)Gotests
自动生成测试用例工具
https://github.com/cweill/gotests

二.调试工具

1)perf
代理工具,支持内存,cpu,堆栈查看,并支持火焰图.
perf 工具和 go-torch 工具,快捷定位程序问题.
https://github.com/uber-archive/go-torch
https://github.com/google/gops

2)dlv 远程调试
基于 goland+dlv 可以实现远程调式的能力.
https://github.com/go-delve/delve
提供了对 golang 原生的支持,相比 gdb 调试,简单太多。

3)网络代理工具
goproxy 代理,支持多种协议,支持 ssh 穿透和 kcp 协议.
https://github.com/snail007/goproxy

4)抓包工具
go-sniffer 工具,可扩展的抓包工具,可以开发自定义协议的工具包. 现在只支持了 http,mysql,redis,mongodb.
基于这个工具,我们开发了 qapp 协议的抓包。
https://github.com/40t/go-sniffer

5)反向代理工具,快捷开放内网端口供外部使用。
ngrok 可以让内网服务外部调用
https://ngrok.com/
https://github.com/inconshreveable/ngrok

6)配置化生成证书
从根证书,到业务侧证书一键生成.
https://github.com/cloudflare/cfssl

7)免费的证书获取工具
基于 acme 协议,从 letsencrypt 生成免费的证书,有效期 1 年,可自动续期。
https://github.com/Neilpang/acme.sh

8)开发环境管理工具,单机搭建可移植工具的利器。支持多种虚拟机后端。
vagrant常被拿来同 docker 相比,值得拥有。
https://github.com/hashicorp/vagrant

9)轻量级容器调度工具
nomad 可以非常方便的管理容器和传统应用,相比 k8s 来说,简单不要太多.
https://github.com/hashicorp/nomad

10)敏感信息和密钥管理工具
https://github.com/hashicorp/vault

11)高度可配置化的 http 转发工具,基于 etcd 配置。
https://github.com/gojek/weaver

12)进程监控工具 supervisor
https://www.jianshu.com/p/39b476e808d8

13)基于procFile进程管理工具. 相比 supervisor 更加简单。
https://github.com/ddollar/foreman

14)基于 http,https,websocket 的调试代理工具,配置功能丰富。在线教育的 nohost web 调试工具,基于此开发.
https://github.com/avwo/whistle

15)分布式调度工具
https://github.com/shunfei/cronsun/blob/master/README_ZH.md
https://github.com/ouqiang/gocron

16)自动化运维平台 Gaia
https://github.com/gaia-pipeline/gaia

三. 网络工具

img

四. 常用网站

go 百科全书: https://awesome-go.com/
json 解析: https://www.json.cn/
出口 IP: https://ipinfo.io/
redis 命令: http://doc.redisfans.com/
ES 命令首页: https://www.elastic.co/guide/cn/elasticsearch/guide/current/index.html
UrlEncode: http://tool.chinaz.com/Tools/urlencode.aspx
Base64: https://tool.oschina.net/encrypt?type=3
Guid: https://www.guidgen.com/
常用工具: http://www.ofmonkey.com/

五. golang 常用库

日志
https://github.com/Sirupsen/logrus
https://github.com/uber-go/zap

配置
兼容 json,toml,yaml,hcl 等格式的日志库.
https://github.com/spf13/viper

存储
mysql https://github.com/go-xorm/xorm
es https://github.com/elastic/elasticsearch
redis https://github.com/gomodule/redigo
mongo https://github.com/mongodb/mongo-go-driver
kafka https://github.com/Shopify/sarama

数据结构
https://github.com/emirpasic/gods

命令行
https://github.com/spf13/cobra

框架
https://github.com/grpc/grpc-go
https://github.com/gin-gonic/gin

并发
https://github.com/Jeffail/tunny
https://github.com/benmanns/goworker
现在我们框架在用的,虽然 star 不多,但是确实好用,当然还可以更好用.
https://github.com/rafaeldias/async

工具
定义了实用的判定类,以及针对结构体的校验逻辑,避免业务侧写复杂的代码.
https://github.com/asaskevich/govalidator
https://github.com/bytedance/go-tagexpr

protobuf 文件动态解析的接口,可以实现反射相关的能力。
https://github.com/jhump/protoreflect

表达式引擎工具
https://github.com/Knetic/govaluate
https://github.com/google/cel-go

字符串处理
https://github.com/huandu/xstrings

ratelimit 工具
https://github.com/uber-go/ratelimit
https://blog.csdn.net/chenchongg/article/details/85342086
https://github.com/juju/ratelimit

golang 熔断的库
熔断除了考虑频率限制,还要考虑 qps,出错率等其他东西.
https://github.com/afex/hystrix-go
https://github.com/sony/gobreaker

表格
https://github.com/chenjiandongx/go-echarts

tail 工具库
https://github.com/hpcloud/taglshi

《go语言核心编程》阅读笔记1

第一章 基础知识

  1. 函数以func开头,{必须在函数头所在行尾部
  2. 字符串用双引号
  3. ->go build hello.go ->./hello
  4. 标识符 包括fallthrough
  5. go也有+= -= … ++ –

字符串

  • 字符串是常量
1
2
var a = "hello"
b:= a[0]
  • 字符串转换成切片[]byte(s)要慎用,每转换一次都复制一次内容
1
b := []byte(s)
  • 字符串的切片 与原字符串指向同一底层数组,一样不能修改,字符串的切片操作返回的仍是string,而非slice
  • 字符串可以转换为字节数组,也可以转换为字数组
1
2
b := []byte(s)
c := []rune(s)
  • 字符串的运算
1
2
c := a+b
len(c)

指针 数组

  • go不支持指针的运算
  • 数组的初始化
1
2
3
4
a := [3]int{1,2,3}
a := [...]int{1,2,3}
a := [3]int{1:1, 2:3} // 没有初始化的位置为零值
a := [...]int{1:1, 2:3} // 数组长度由提供的最大索引决定
  • 数组创建完长度就固定了,不可再追加元素

切片

  • 切片的创建
1
2
3
4
5
6
7
8
9
// 1. 通过数组创建
array := [...]int{1,2,3,4,5,6,7,8,9}
slice := array[1:3] // 同Python,Java 左闭右开
// 2. 通过make创建
a := make(int[], 10) // len==cap==10
b := make(int[], 10, 20) // len=10, cap=20
// 直接声明切片的类型变量是没有意义的
var a []int
fmt.Printf("%v\n", a) // []
  • 切片支持的操作:len() cap() append() copy()
1
2
3
4
// 将c添加到b中 (返回新的slice,不改变b)
b = append(b, c...)
// 将d拷贝到c中 (不改变c)
copy(c, d) // copy 只会复制c d中较短的

map

  • map的创建
1
2
3
4
5
6
// 1. 使用自变量创建
ma := map[string]int{"a":1, "b":2}
// 2. 使用make创建
mb := make(map[string]int)
// 删除
delete(ma, "b")
  • go内置的map不是线程安全的,标准包sync中的map是
  • 修改map中元素的值,最好整体替换
1
2
3
4
5
6
//如, 不要使用:
ma[1].age = 19
// 改为
a := ma[1]
a.age = 19
ma[1] = a

struct

初始化

1
2
3
4
5
6
7
8
9
// 1. 按照类型声明顺序,逐个赋值
// 不推荐, 一旦struct增加字段,整个初始化语句会报错
a := Person{"Tom", 21}
// 推荐的初始化方式
// 2. 使用field名字初始化,没有指定字段的为零值
p := &Person{
Name: "tata",
Age: 21,
}

if

go没有a?b:c

1
2
3
4
5
if [;] {
}
else if {
}else{
}

switch

fallthough强制执行下一个case子句(不判断下一个case条件)
当所有case不符合时执行default, 且default语句可以放到任意位置。

标签和跳转

1
2
3
4
5
6
7
8
9
10
11
L1:
for i:=0; ; i++{
for :j=0; ; j++{
if i>=5{
break L1
}
if j>10{
break
}
}
}
1
2
3
4
5
6
7
8
9
10
11
L1:
for i:=0; ; i++{
for j:=; ; j++{
if i>=5{
continue L1
}
if j>10{
continue
}
}
}

第二章 函数

不定参数

不定参数必须是函数的最后一个参数
不定参数名在函数体内相当于切片
切片可以作为参数传给不定参数, func(slice…)

1
2
3
4
5
6
7
8
9
10
11
12
13
func sum(a, arr ...int) (sum int){
sum = a
for _, v := range arr{
sum += v
}
return
}
func main(){
slice := []int{1,2,3,4}
array := [...]int{1,2,3,4}
// 数组不可作为参数给不定参数
sum(0, slice...)
}

函数签名

fmt.Printf 的%T 格式化参数打印函数类型
2个函数相同的条件是,拥有相同的形参列表和返回值列表,形参名可以不同

1
fmt.Printf("%T\n", add) // func(int, int) int
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package main
import "fmt"
func add(a, b int) int {
return a + b
}
func sub(a, b int) int {
return a - b
}
type Op func(int, int)int //定义一个函数类型,输入的是两个int类型
//返回值是一个int类型
func do (f Op, a, b int) int { //定义一个函数,第一个参数是函数类型Op
return f(a,b)//函数类型变量可以直接用来进行函数调用
}
func main() {
a := d(ad,1,2)//函数名a可以当作相同函数类型形参,不需要强制类型转换
fmt.Println(a)//3
s := do(sub, 1, 2)
fmt.Println(s)//-1
}
1
f := sum //函数可以直接赋值给变量

匿名函数作为返回值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
func wrap(op string) fun(int, int) int{
switch op{
case "add":
return func(a, b int) int{
return a+b
}
case "sub":
return func(a, b int) int{
return a-b
}
default:
return nil
}
}

defer

defer注册多个延迟调用,先进先出
主动调用os.Exit(int) 退出进程时,defer将不再执行(即使defer已经提前注册)
一般defer语句放错误检查语句之后,不然有可能产生panic,如:

1
2
3
4
5
dst, err := os.Create(dst)
if err != nil {
return
}
defer dst.close()

闭包

闭包最初的目的是减少全局变量,在函数调用的过程中隐式地传递共享变量,有其有用的面;但是这种隐秘的共享变量的方式带来的坏处是不够直接,不够清晰,除非是非常有价值的地方,一般不建议使用闭包。
对象是附有行为的数据,而闭包是附有数据的行为,类在定义时已经显式地集中定义了行为,但是闭包中的数据没有显式地集中声明的地方,这种数据和行为耦合的模型不是一种推着的编程模型,闭包仅仅是锦上添花的东西,不是不可缺少的

panic recover

panic主动抛出错误,recover捕获panic抛出的错误
recover只有在defer后面的函数体内被直接调用才能捕获panic异常(?)

第四章 接口

接口类型查询语法:

1
2
3
4
5
6
7
8
switch v:= i.(type) {
case type1:
xxxxx
case type2:
xxxxx
default:
xxxxx
}

:D 一言句子获取中...