正如评论中所提到的,构建标志可能是解决您需要的最佳方式.例如,如果您希望某些功能仅在开发中可用,请使用dev标志:
文件constants_dev.go:
// +build dev
const DEVELOPMENT = true
Run Code Online (Sandbox Code Playgroud)
文件constants_pro.go
// +build !dev
const DEVELOPMENT = false
Run Code Online (Sandbox Code Playgroud)
然后在你的代码中,做一个简单的if DEVELOPMENT { blah... }.我发现它比任何预处理器都更具可读性.如果你有很多构建标志,这可能会变得非常混乱,但在那时你可能应该使用命令行参数.
在您的评论中,您提到了代码重复.如果您的代码确实是重复的,那么您可能应该将其放在函数中,或者可能重构代码以重用重复的位.就个人而言,我发现除了简单的布尔检查之外的任何事情都以难以维护的代码结束,特别是对于C风格的宏.
泛型也是如此.在我使用的一个Java库中,类签名是这样的:
class Thing<A, B, C, D, E>
Run Code Online (Sandbox Code Playgroud)
这个库没有很好的文档记录,因此我必须阅读大量的代码(实现和使用该库的代码)才能理解正在发生的事情.
在Go中,语言强制一种通常会导致更好的自我记录代码的样式.我认为Go开发人员省略了诸如预处理器和泛型之类的东西,以避免编写难以维护但很聪明的代码的诱惑.
在回顾之前使用的旧习语之前,我建议你试试Go方式.我想你会发现大多数使用的宏和#defines都是无关紧要的.
我认为cpp,m4或其他任何可能满足你对Go进行预处理的愿望.如果这是一个好主意或不是你的决定,但要注意任何预处理是采用任何已发布的Go代码的重大障碍.(例如,依赖于makefile的构建是同一个故事.)