框架开发(一):框架开发-目录介绍和路由设计

1.背景介绍

使用Go开发Web API框架,验证学习成果。在实践中学习。

2.目录介绍

 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
├── README.md
├── app
│   ├── app.go //主程序文件
│   ├── common // 公共文件
│   │   ├── base_controller.go // 控制器基类
│   │   ├── base_model.go // 模型基类
│   │   ├── error.go // 错误处理
│   │   ├── global.go // 全局变量
│   │   ├── response_code.go // api返回code定义
│   │   └── router.go // 路由解析
│   ├── config // 配置目录
│   │   ├── dev.ini // 测试环境配置(默认加载)
│   │   ├── local.ini // 本地环境配置
│   │   └── mysql_config.go
│   ├── controllers // 控制器目录
│   │   ├── v1 
│   │   └── v2
│   ├── models // 数据库模型文件
│   │   └── user.go
│   └── static // 静态资源目录
│       └── a.png
├── go.mod
├── go.sum
├── main.go // 启动文件
└── test // 测试目录

3. 启动流程

image-20210222151006966

Go扩展包(十五):jsoniter

1. 介绍

json-iterator是一款快且灵活的JSON解析器,不但100%兼容标准库encoding/json,而且比其更快。虽然官网说比标准包encoding/json快6倍之多,但是随着Go版本的不断迭代,目前平均比encoding/json快2倍。

Go扩展包(十四):go-funk

1. 介绍

Go-funk 是基于反射(reflect )实现的一个现代Go工具库,封装了对slice/map/struct/string等的操作。

2. 下载

1
2
3
4
# 下载
go get github.com/thoas/go-funk
# 引入
import github.com/thoas/go-funk

3. 切片(slice)操作

3.1 判断元素是否存在

  • funk.Contains: 接收任意类型。
  • funk.ContainsX: X代表具体类型,如:ContainsInt、ContainsString...
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
func TestExist(t *testing.T) {
	// 判断任意类型
	fmt.Println("str->", funk.Contains([]string{"a", "b"}, "a"))
	// int 类型
	fmt.Println("int->", funk.ContainsInt([]int{1, 2}, 1))
}
/**输出
=== RUN   TestExist
str-> true
int-> true
--- PASS: TestExist (0.00s)
PASS
*/

3.2 查找元素第一次出现位置

  • funk.IndexOf: 接收任意类型,不存在则返回-1。
  • funk.IndexOfX: X代表具体类型,不存在则返回-1。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
func TestIndexOf(t *testing.T) {
	strArr := []string{"go", "java", "c", "java"}
	// 具体类型
	fmt.Println("c: ", funk.IndexOfString(strArr, "c"))
	// 验证第一次出现位置
	fmt.Println("java: ", funk.IndexOfString(strArr, "java"))
	// 任意类型
	fmt.Println("go: ", funk.IndexOf(strArr, "go"))
	// 不存在时返回-1
	fmt.Println("php: ", funk.IndexOfString(strArr, "php"))
}
/**输出
=== RUN   TestIndexOf
c:  2
java:  1
go:  0
php:  -1
--- PASS: TestIndexOf (0.00s)
PASS
*/

3.3 查找元素最后一次出现位置

  • funk.LastIndexOf: 接收任意类型,不存在则返回-1。
  • funk.LastIndexOfX: X代表具体类型,不存在则返回-1。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
// 查找元素最后一次出现的位置
func TestLastOf(t *testing.T) {
	strArr := []string{"go", "java", "c", "java"}
	// 具体类型
	fmt.Println("c: ", funk.LastIndexOfString(strArr, "c"))
	// 验证第一次出现位置
	fmt.Println("java: ", funk.LastIndexOfString(strArr, "java"))
	// 任意类型
	fmt.Println("go: ", funk.LastIndexOf(strArr, "go"))
	// 不存在时返回-1
	fmt.Println("php: ", funk.LastIndexOf(strArr, "php"))
}
/**输出
=== RUN   TestLastOf
c:  2
java:  3
go:  0
php:  -1
--- PASS: TestLastOf (0.00s)
PASS
*/

3.4 批量查找(都有则True)

func Every(in interface{}, elements ...interface{}) bool

Go工具(四):性能调试利器pprof(三)

1. trace说明

在pprof的分析中,能够知道一段时间内的CPU占用、内存分配、协程堆栈信息。这些信息都是一段时间内数据的汇总,但是它们并没有提供整个周期内发生的事件,例如指定的Goroutines何时执行、执行了多长时间、什么时候陷入了堵塞、什么时候解除了堵塞、GC如何影响单个Goroutine的执行、STW中断花费的时间是否太长等。这就是在Go1.5之后推出的trace工具的强大之处,它提供了指定时间内程序发生的事件的完整信息,这些事件信息包括:

Go扩展包(十八):trace

1. trace说明

在pprof的分析中,能够知道一段时间内的CPU占用、内存分配、协程堆栈信息。这些信息都是一段时间内数据的汇总,但是它们并没有提供整个周期内发生的事件,例如指定的Goroutines何时执行、执行了多长时间、什么时候陷入了堵塞、什么时候解除了堵塞、GC如何影响单个Goroutine的执行、STW中断花费的时间是否太长等。这就是在Go1.5之后推出的trace工具的强大之处,它提供了指定时间内程序发生的事件的完整信息,这些事件信息包括:

Go工具(三):性能调试利器pprof(二)

1. 调用图说明

1.1 示例图

1.2 节点颜色

  • 红色代表累计值cum为正,并且很大;
  • 绿色代表累计值cum为负,并且很大;
  • 灰色代表累计值cum可以忽略不计。

1.3 节点字体大小

  • 较大的字体表示较大的当前值;
  • 较小的字体表示较小的当前值。

1.4 边框颜色

  • 当前值较大并且为正数时为红色;
  • 当前值较小并且为负数时为绿色;
  • 接近0的当前值为灰色。

1.5 箭头大小

  • 箭头越粗代表当前的路径消耗了越多的资源;
  • 箭头越细代表当前的路径消耗了越少的资源。

1.6 箭头类型

  • 虚线箭头表示两个节点之间的某些节点已被忽略,为间接调用;
  • 实线箭头表示两个节点之间为直接调用。

2. 火焰图说明

2.1 示例图

Go扩展包(十七):pprof-2

1. 调用图说明

1.1 示例图

1.2 节点颜色

  • 红色代表累计值cum为正,并且很大;
  • 绿色代表累计值cum为负,并且很大;
  • 灰色代表累计值cum可以忽略不计。

1.3 节点字体大小

  • 较大的字体表示较大的当前值;
  • 较小的字体表示较小的当前值。

1.4 边框颜色

  • 当前值较大并且为正数时为红色;
  • 当前值较小并且为负数时为绿色;
  • 接近0的当前值为灰色。

1.5 箭头大小

  • 箭头越粗代表当前的路径消耗了越多的资源;
  • 箭头越细代表当前的路径消耗了越少的资源。

1.6 箭头类型

  • 虚线箭头表示两个节点之间的某些节点已被忽略,为间接调用;
  • 实线箭头表示两个节点之间为直接调用。

2. 火焰图说明

2.1 示例图

Go工具(二):性能调试利器pprof(一)

1. 介绍

Go语言中的pprof指对于指标或特征的分析(Profiling),通过分析不仅可以查找到程序中的错误(内存泄漏、race冲突、协程泄漏),也能对程序进行优化(例如CPU利用率不足)。

Go扩展包(十六):pprof

1. 介绍

Go语言中的pprof指对于指标或特征的分析(Profiling),通过分析不仅可以查找到程序中的错误(内存泄漏、race冲突、协程泄漏),也能对程序进行优化(例如CPU利用率不足)。