登录
首页 >  Golang >  Go问答

为何在Go的常量中无法使用`math.Sin`函数?

来源:stackoverflow

时间:2024-03-02 21:57:23 479浏览 收藏

从现在开始,我们要努力学习啦!今天我给大家带来《为何在Go的常量中无法使用`math.Sin`函数?》,感兴趣的朋友请继续看下去吧!下文中的内容我们主要会涉及到等等知识点,如果在阅读本文过程中有遇到不清楚的地方,欢迎留言呀!我们一起讨论,一起学习!

问题内容

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

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

其他语言也支持此类事情。以C语言为例:从4.3版本开始,GCC支持正弦函数的编译时计算。 (请参阅“常规优化器改进”部分)。

但是,正如 Bruce Dawson 在这篇博文中指出的那样,这可能会导致意想不到的问题。 (请参阅“编译时与运行时sin”部分)。

这是 Go 中的一个相关问题吗?或者此用途是否因其他原因而受到限制?


解决方案


Go 根本就缺乏这个概念。无法将函数标记为纯函数(其返回值仅取决于其参数,并且不会改变任何类型的可变状态或执行 I/O),编译器无法推断纯粹性,并且没有尝试在编译时评估包含函数调用的任何表达式(因为除了常量参数的纯函数之外,对任何东西这样做都会导致奇怪的行为和错误,并且因为添加机制使其正常工作所需的时间会带来相当多的复杂性)。

是的,这是一个巨大的损失,它迫使我们在运行时行为不佳的代码和丑陋的代码之间进行权衡。 Go 的支持者会选择丑陋的代码,并告诉你,你是一个坏人,因为你不觉得它漂亮。

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

Go 不支持使用函数结果初始化常量。函数在运行时调用,而不是在编译时调用。但常量是在编译时定义的。

可以对某些函数(例如 math.Sin)进行例外处理,但这会使规范变得更加复杂。 Go 开发人员通常更喜欢保持规范简单且一致。

文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《为何在Go的常量中无法使用`math.Sin`函数?》文章吧,也可关注golang学习网公众号了解相关技术文章。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>