为什么在Go中复数是原始数字类型?

Mat*_*iak 5 go

Go为复数定义了两种数字类型,complex64complex128。这是罕见的。大多数编程语言将复数定义为实部和复杂部分的组合,而不是为此目的包括特定的原语。(即使在群论中,复数也被正式构造为成对的实数。)为什么Go的设计者决定Go需要复数的原始类型?

pet*_*rSO 5

Go 的主要作者之一 Ken Thompson 想要在 Go 中使用复数,因此他将它们添加到 Go 语言规范中,并为 Go gc 编译器实现了复数。

  • 很遗憾他停在那里。复数很有用,但也可以在库中轻松完成。有理数也很有用,并且*仅*在库中可用。有一个令人不快的不平衡,因为使用有理数的代码看起来很糟糕,而复数有很好的运算符。运算符重载(至少对于主要的四个 + - * /)比内置的复数支持(IMO)有用得多。这可以通过任何库必须满足的特殊接口来完成,以便有资格使用算术运算符。 (3认同)
  • 事实上,他在我之前链接的讨论中发表了评论(https://groups.google.com/d/msg/golang-nuts/7bW5JmUbAB8/rJLvwYzqRmEJ),说“我对此感兴趣并希望做点什么。” 看起来他确实做到了。 (2认同)

Vol*_*ker 0

因为它们非常有用?并且:复数就是:实部和虚部。

  • 您想要复数的 math/big/Rat 语法吗?可能不会。如果“x”和“y”不是基本类型,则不能在 Go 中执行“x + y”,因为没有运算符重载。 (5认同)
  • 这并不能解释为什么它们被定义为原始数据类型,而不是像许多其他语言那样被定义为元组并包装在数学库中。 (2认同)