使用 dlv 进行 debug

使用 dlv 可以方便的对 go 生成的二进制文件进行 debug,以下面的代码 main.go 为例讲解 dlv 的使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package main

import (
"fmt"
"net/http"
"time"
)

func Hello(w http.ResponseWriter, r *http.Request) {
q := r.URL.Query().Get("q")
if q != "" {
fmt.Printf("search query: %s\n", q)
}
fmt.Fprintf(w, "Hello World! %s", time.Now())
}

func main() {
http.HandleFunc("/", Hello)
http.ListenAndServe(":8080", nil)
}

阅读更多

Rust 编写 derive 宏

宏可以帮助我们减少重复代码的编写,在 Rust 中有两种宏定义,

  • 声明宏
  • 过程宏

其中,声明宏只是简单的 token 替换,我们无法知道代码结构中的其他信息,过程宏可以获取更加详细的数据,比如我们可以获取结构体中字段的名称,类型等等。

阅读更多

Rust 参数设置默认值

Option 模式?

在调用函数的时候,可能参数比较多,但是我们只需要修改其中的几个特定参数就可以满足我们的需求,而其他的参数我们希望保持不变,但是 Rust 和 Go 一样,函数调用中不支持默认参数,所以我们必须另寻他法,那么第一感觉我们是不是可以采用 Go 中的 选项模式呢?

虽然 Rust 函数中并不支持变参数传递,但是我们可以通过 来间接达到相同的功能,代码如下

阅读更多

Go 代码测试覆盖度

在 Go 语言中,本身提供了一些命令来展示代码的覆盖度,我们可以通过执行这些命令来查看哪些语句被测试覆盖到了,哪些没有,进而可以编写更多的 case 来提高代码的覆盖度。

执行下面的命令,可以得出项目里面所有 package 的覆盖度

1
go test ./... -cover
阅读更多

SPHINCS

SPHINCS 于 2015 年由 Bernstein, Daniel J., Daira Hopwood, Andreas Hülsing 等人提出,具体的论文见 SPHINCS: practical stateless hash-based signatures

SPHINCS 是一个无状态的签名系统。有状态指的是每次签名时需要记录系统的信息,比如是第几次签名,在验证的时候需要使用该参数,而无状态的签名系统则不需要保存这些信息。相对于有状态的签名系统,无状态的签名系统不需要记录签名的状态,符合标准的 API 且方便在不同主机上移植,无状态的签名系统是更好的选择。

SPNHICS 基于多种签名算法,比如 WOTS+, HORST 等,如果不了解相关内容,建议先参考之前的文章。

阅读更多