今天让我们在构建过程中使用一些真正的宏!这会把我们带回到90年代的命令行工具,以及那些精通C语言预处理器的人可能会记得的一些事情。
首先,让我们创造一个问题背景:
我们将重温函数式编程的最爱:MAP, FILTERFOLDL
。我们将选择两个简单的操作: map/filter
。我们将使用C语言预处理器,所以我们的宏看起来会像C的宏,当然,欢迎你使用 M4或其他更通用的预处理器,也许你可以自己写。编程学习资源点击免费领取
开始
本篇文章的准备很直接:启动一个go项目,然后写一个 makefile
。下面将从这个目录结构开始。
.
├── app.cgo
├── go.mod
├── macros
│ └── functions.h
└─── makefile
复制代码
看看 app.cgo
的内容是啥:
package main
import (
"fmt"
"math/rand"
)
type Demo struct {
A int
}
func main() {
as := []Demo{}
for i := 0; i < 1000; i++ {
as = append(as, demo.Demo{A: rand.Intn(100)})
}
}
复制代码
需要说明的是:通常我们会使用传统的 for i := range array
,上述我们没有这样做,是因为可以更好地测试我们的宏:
bs := []Demo{}
for i := range as {
if as[i].A < 50 {
bs = append(bs, as[i])
}
}
fmt.Printf("bs=%d demos\n", len(bs))
复制代码
在我运行的机器上,最终向bs中插入了506个元素。你的结果可能不同,但是在多次运行中应该是一致的结果(rand并不是真正的随机)。
不过在开始实验前,还有一件事要做:把我们的makefile补