根据Effective Go,函数math.Sin不能用于定义常量,因为该函数必须在运行时发生。

此限制的背后原因是什么?浮点一致性? Sin实现的怪癖?还有吗

其他语言也支持这种事情。在C中,例如:从4.3版本开始,GCC supports compile-time calculation of the sine function。 (请参阅“常规优化程序的改进”一节)。

但是,如this blog post by Bruce Dawson中所述,这可能会导致意外的问题。 (请参见“编译时与运行时”一节)。

这与Go相关吗?还是由于其他原因而限制使用?

最佳答案

Go根本没有这个概念。无法将函数标记为纯函数(其返回值仅取决于其参数,并且它不会更改任何可变状态或执行I / O),编译器无法推断纯函数,并且没有尝试在编译时评估任何包含函数调用的表达式(因为对除常量参数的纯函数之外的任何事情进行此操作都会产生奇怪的行为和错误,并且因为添加使它正确运行所需的机制会引入了很多复杂性)。

是的,这是一个巨大的损失,这迫使运行时行为不良的代码与丑陋的代码之间进行权衡。游击队成员会选择难看的代码,并告诉您您是一个不好的人,因为没有找到漂亮的代码。

您可以使用的最好的东西就是代码生成。将go generate集成到工具链中,以及在标准库中提供完整的Go解析器,可以相对轻松地在构建时修改代码,使用此功能可以做的一件事情是创建更高级的常量折叠你这样选择。您仍然会遇到代码生成的所有可调试性风险,但这就是事实。

关于go - 为什么在Go常量中不允许使用“math.Sin”?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55288815/

10-11 22:48
查看更多