Go语言支持操作符类型的变量吗?

huangapple go评论113阅读模式
英文:

Does Go support operator type variables?

问题

这可能不是一个很好的问题,因为我不知道任何支持这个特性的编译语言,但由于Go语言经常让我感到惊讶,我还是问一下:

为了练习,我正在用Go语言编写一个小型计算器程序。我想知道是否有一种方法可以声明和赋值一个类型为"Operator"的变量,这样我就可以像这样写:

  1. var o Operator
  2. o = +
  3. var o1 Operator
  4. o1 = /

并且编写如下的函数:

  1. func DoOperation(a, b int, o Operator) int {
  2. return a o b
  3. }

(不,我不是在问运算符重载的问题。)

我不知道有哪些编译语言支持这样的功能(我对此不是很了解)。我查看了Go语言的文档中的运算符部分,但没有找到相关内容。Go语言会再次让我感到惊喜吗?

编辑: 接受的答案指出Haskell支持这一点,

英文:

This is might not be such a good question, since I don't know of any compiled language that supports this feature, but since Go is constantly surprising me, I'll ask it anyway:

For my own practice, I am writing a little calculator program in Go. I'm wondering if there is a way I can declare and assign a variable of type "Operator", such that I could, for example, write:

  1. var o Operator
  2. o = +
  3. var o1 Operator
  4. o1 = /

and write function like this

  1. func DoOperation(a,b int,o Operator) int{
  2. return a o b
  3. }

(No, I am not asking about operator overloading.)

Offhand, I don't know of any compiled language that supports such a thing (I'm not an expert in this). I did look at the docs under operators and found nothing. Can Go surprise me again?

Edit: The accepted answer states that Haskell supports this,

答案1

得分: 7

不,Go运算符不是函数,因此没有有效的右侧表达式。它们以一种通用的方式工作,例如加法运算符适用于所有数值类型,而类似Haskell的中缀表示法也不受支持。

您将需要使用反射编写自己的“软”通用加法函数。

一个编译语言可以满足您所有要求的是Haskell。

英文:

No, Go operators are not functions and hence no valid right-hand expressions. They work in a generic way e.g. the plus-operator works on all numeric types and infix-notation a la haskell is not supported either.

You would have to write your own "soft"-generic addition function using reflection.

One compiled language that covers all of your requirements is Haskell.

答案2

得分: 5

你不能完全按照你说的那样做,但是你可以使用函数来代替。你需要为每个运算符编写函数,但这只需要很少的代码。

  1. type BinaryOperator func(a, b int) int
  2. func OpAdd(a, b int) int { return a + b }
  3. func OpSub(a, b int) int { return a - b }
  4. func ApplyBinaryOperator(a, b int, op BinaryOperator) int {
  5. return op(a, b)
  6. }

你可以定义一个BinaryOperator类型的函数,它接受两个整数参数并返回一个整数。然后,你可以编写OpAddOpSub函数来执行加法和减法操作。最后,你可以使用ApplyBinaryOperator函数来应用任何二元运算符。

英文:

You can't do exactly what you say, but you can use functions instead. You have to write functions for each operator, but that's relatively little code.

  1. type BinaryOperator func(a, b int) int
  2. func OpAdd(a, b int) int { return a + b }
  3. func OpSub(a, b int) int { return a - b }
  4. func ApplyBinaryOperator(a, b int, op BinaryOperator) int {
  5. return op(a, b)
  6. }

答案3

得分: 0

从面向对象编程(OOP)的背景出发,我开始编写以下代码:

  1. package main
  2. import "fmt"
  3. type MyInt int64
  4. func (i *MyInt) Add(n MyInt) *MyInt {
  5. *i += n
  6. return i
  7. }
  8. func (i MyInt) String() string {
  9. v := int64(i)
  10. return fmt.Sprintf("0x%x (%d)", v, v)
  11. }
  12. func main() {
  13. x := MyInt(10)
  14. x.Add(10).Add(20).Add(30)
  15. fmt.Println("x =", x)
  16. }

请注意,这是一个使用Go语言编写的程序,它定义了一个名为MyInt的自定义类型,并为其定义了两个方法:AddStringAdd方法用于将给定的整数与MyInt类型的变量相加,并返回结果。String方法用于将MyInt类型的变量转换为字符串表示形式。

main函数中,我们创建了一个名为xMyInt类型的变量,并连续调用了Add方法四次,每次传入不同的整数。最后,我们使用fmt.Println函数打印出x的值。

希望这对你有帮助!

英文:

Coming from an oop background I started doing this :

  1. package main
  2. import "fmt"
  3. type MyInt int64
  4. func (i * MyInt) Add(n MyInt) * MyInt {
  5. *i += n
  6. return i
  7. }
  8. func (i MyInt) String() string {
  9. v := int64(i)
  10. return fmt.Sprintf("0x%x (%d)", v, v)
  11. }
  12. func main() {
  13. x := MyInt(10)
  14. x.Add(10).Add(20).Add(30)
  15. fmt.Println("x = ", x)
  16. }

huangapple
  • 本文由 发表于 2014年3月25日 14:39:14
  • 转载请务必保留本文链接:https://go.coder-hub.com/22627113.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定