编写 Golang 单元测试(Unit Test)

单元测试文件和用例方法命名

Go 语言推荐测试文件和源代码文件放在一起。测试文件以 “_test.go” 结尾(这样在 go build 的时候才不会被包含)。

example/
    |-- biz.go
    |-- biz_test.go

普通测试 TestXxx

普通测试用例的方法以 Test 开头,参数为 t *testing.T

阅读全文 →

Docker 设置代理

配置代理

sudo mkdir -p /etc/systemd/system/docker.service.d
# 写入 /etc/systemd/system/docker.service.d/proxy.conf
[Service]
Environment="HTTP_PROXY=http://bb.bb.com"
Environment="HTTPS_PROXY=http://bb.bb.com"
Environment="NO_PROXY=aa.bb.com"

然后

sudo systemctl daemon-reload
sudo systemctl restart docker

配置镜像仓库

更新:大部分已经不可用

对于使用 systemd 的系统,请在 /etc/docker/daemon.json 中写入如下内容(如果文件不存在请新建该文件)

阅读全文 →

Git 常用撤回操作

Git 常用撤销操作

1 没有 add 撤销

git checkout <file-path>

这样就可以把文件恢复到 git 版本里的样子。

2 add 后撤销

如果修改的文件已经 add 了,可以用下面的方法撤销 add。

git reset HEAD <file-name> # 撤销某个文件
git reset # 撤销所有文件

同样,另一个操作也可以达到一样的效果

阅读全文 →

Go channel 实现

整体结构

Channel 的操作对应在运行时里的方法(都在 $GORROT/src/runtime/chan.go 里)

Channel 操作 运行时方法
make(chan int, 4) makechan(int, 4)
make(chan int) makechan(int, 0)
ch <- v chansend1(ch, &v)
v <- ch chanrecv1(ch, &v)
close(ch) closechan(ch)

channel 的基本数据结构

makechan 返回的是一个叫做 hchan 的结构。所以 chan 本质上是用 hchan 表示的,它的传参与赋值始终都是指针形式,每个 hchan 对象代表着一个 chan。

阅读全文 →

go generate 使用

当运行 go generate 命令时,他会扫描当前包相关的源代码文件,找出所有包含有 //go:generate 的特殊注释,提取并执行注释后面的命令,命令为可执行程序,如同在 shell 下面执行。

需要注意的

  • 这个注释必须在 .go 源码文件中

阅读全文 →

go trace 使用

1 Go trace 介绍

go trace 在 go 1.5 版本加入,会在运行中收集以下事件的所有数据

  • 创建,启动和终止 goroutine

  • 阻塞/非阻塞 goroutines(syscalls, channels, locks)

  • 网络 io

  • Syscalls

  • gc

收集后不会做任何类型的聚合和抽样。

pprof 用来分析 CPU 和内存分别用在了哪里,trace 用来确定什么阻止了 goroutine 运行,goroutine 在 OS 线程上如何被调度。

阅读全文 →

Go pprof 使用

1 概览

pprof 是 Go 提供的一套可视化和分析性能分析数据的工具。 主要包含两部分

  • runtime/pprof 编译进了每个 go 程序

  • go tool pprof 用来分析 profile

Profiling 可以翻译成画像,类似在侦破案件的时候警察会对嫌疑人做的画像。profiling 就是对应用做的画像,描述应用使用 CPU 和内存的情况,用了多少,在哪些地方使用等等。

阅读全文 →