2019年7月

nil 是什么?

可以看看官方的描述,在 buildin/buildin.go 里:

// nil is a predeclared identifier representing the zero value for a
// pointer, channel, func, interface, map, or slice type.
var nil Type // Type must be a pointer, channel, func, interface, map, or slice type

nil 是一个预先声明的标识符,代表指针、通道、函数、接口、哈希表或切片的零值。

OK,回到问题,nil 能比较自己吗?

阅读全文

cURL,熟悉 Linux 的同学,没有人不知道这个命令吧:)

它有非常非常多的参数,我这里就不复制粘贴了,有需要可以 -h 或者谷歌搜索看看。

我从实用性的角度,说下我比较常用的几个参数:

  • -v:啰嗦模式,打印请求头部、响应头部,如果是 https 请求会打印握手信息;
  • -H:包含 HTTP 头部,可多次使用
  • -s:不打印进度条
  • -o:指定输出,如果不想看输出的内容,可以 -o /dev/null 丢弃
  • -k:忽略 https 证书校验
  • -d:用来提交数据
  • -X:指定 HTTP method
  • -w:可以输出连接的时间、服务器处理的时间、请求总时间等

简单的参数组合

curl -v -H 'Host: imlht.com.test' \
     -H 'Content-Type: application/json' \
     -H 'Cookie: uid=123' \
     -s \
     -o /dev/null \
     -X PUT \
     -k \
     -d '{"name": "John"}' https://10.43.1.101/user/123

有几个小细节,我提一下:

-k 可以忽略 https 的证书校验,调试的时候很好用。

比如上面的 imlht.com.test,一般情况下你是没有这个证书的,但是你又想测试 10.43.1.101 的 /user 接口,此时可以直接跳过测接口的内容。

-d 参数默认的 Content-Type 是表单,如果你提交的数据是 JSON,需要像上面一样指定好 JSON 头部。

有些接口会依赖这个头部解析 body 的内容;另外默认的 method 是 POST,这里我用了 -X PUT 指定 method。

有点复杂的 -w 参数

curl -w "\ntime_namelookup: %{time_namelookup}\ntime_connect: %{time_connect}\ntime_appconnect: %{time_appconnect}\ntime_redirect: %{time_redirect}\ntime_pretransfer: %{time_pretransfer}\ntime_starttransfer: %{time_starttransfer}\n--------\ntime_total: %{time_total}\n" https://im.qq.com/
(省略一部分内容)
...
</body>
</html>

time_namelookup: 0.028
time_connect: 0.030
time_appconnect: 0.136
time_redirect: 0.000
time_pretransfer: 0.136
time_starttransfer: 0.296
--------
time_total: 0.436
  • time_namelookup :DNS 解析耗时
  • time_connect :TCP 连接建立耗时,也就是三次握手的时间
  • time_appconnect :SSL/SSH 等上层协议建立连接的时间,比如 connect/handshake 的时间
  • time_redirect :从开始到最后一个请求事务的时间
  • time_pretransfer :从请求开始到响应开始传输的时间
  • time_starttransfer :从请求开始到第一个字节将要传输的时间
  • time_total :这次请求花费的全部时间

根据上面的解释,我们可以得到以下的结论:

  • DNS 解析耗时:28ms
  • TCP 连接时间: pretransfter(136) - namelookup(28) = 108ms
  • 服务器处理时间:starttransfter(296) - pretransfer(136) = 160ms
  • 内容传输时间: total(436) - starttransfer(296) = 140ms