Macros Go中的C风格宏

Macros Go中的C风格宏,macros,go,Macros,Go,我已经玩围棋一周了,我从C中错过了一些东西,那就是预处理器宏 除了破解一个构建脚本,让文件通过clang-E,我还能用什么来获得这个功能?我认为cpp、m4或任何可能满足您对go预处理的需求的东西。如果这是一个好主意或不是你的决定,但请注意,任何预处理都是采用任何已发布Go代码的一个重大障碍。(例如,依赖于makefiles的构建也是如此。)如评论中所述,构建标志可能是解决任何问题的最佳方法。例如,如果您希望某些功能仅在开发中可用,请使用dev标志: 文件常量\u dev.go: // +bui

我已经玩围棋一周了,我从C中错过了一些东西,那就是预处理器宏


除了破解一个构建脚本,让文件通过
clang-E
,我还能用什么来获得这个功能?

我认为cpp、m4或任何可能满足您对go预处理的需求的东西。如果这是一个好主意或不是你的决定,但请注意,任何预处理都是采用任何已发布Go代码的一个重大障碍。(例如,依赖于makefiles的构建也是如此。)

如评论中所述,构建标志可能是解决任何问题的最佳方法。例如,如果您希望某些功能仅在开发中可用,请使用
dev
标志:

文件常量\u dev.go:

// +build dev
const DEVELOPMENT = true
文件常量\u pro.go

// +build !dev
const DEVELOPMENT = false
然后在代码中,只需执行一个简单的
if DEVELOPMENT{blah…}
。我发现这比任何预处理器都可读。如果您有很多构建标志,这可能会变得非常混乱,但此时您可能应该使用命令行参数

在您的评论中,您提到了代码的重复。如果你的代码真的那么重复,你可能应该把它放在一个函数中,或者可能重组代码以重用重复的位。就我个人而言,我发现除了简单的布尔检查之外,任何东西都会导致难以维护的代码,特别是对于C风格的宏

泛型也是如此。在我使用过的一个Java库中,类签名是这样的:

class Thing<A, B, C, D, E>
类的东西
该库没有很好的文档记录,所以我必须阅读大量代码(包括实现和使用该库的代码)才能理解发生了什么

在Go中,这种语言强制使用一种风格,这种风格通常会产生更好的、自文档化的代码。我认为Go开发人员省略了诸如预处理器和泛型之类的东西,以避免编写难以维护但很聪明的代码


我建议你在回顾以前使用过的老成语之前,先尝试一下围棋。我想你会发现宏和#定义的大部分用途在很大程度上是不相关的。

我想你错过了围棋的一些哲学。例如,清晰性的重要性。当然清晰性很重要,但我不认为重复多次相同的代码对清晰性更好。如果您给出一个示例,说明您试图实现的目标,很可能有一种更“去”的方法。虽然没有宏,但可以使用去。这与元编程无关,但它是C语言中宏的应用领域之一,因此我认为这一点值得一提。Go之所以没有引入宏,是因为预处理器会降低编译速度。也许谷歌计划在将来使用围棋作为一种脚本。