Go是否支持运算符类型变量?

时间:2014-03-25 06:39:14

标签: variables go operators variable-assignment

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

对于我自己的练习,我正在Go中编写一个小计算器程序。我想知道是否有一种方法可以声明并分配一个类型为“运算符”的变量,这样我就可以编写:

var o Operator

o = +

var o1 Operator

o1 = /

并编写这样的函数

func DoOperation(a,b int,o Operator) int{

    return a o b

}

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

副手,我不知道任何支持这种事情的编译语言(我不是这方面的专家)。我确实查看了运算符下的文档并没有发现任何内容。可以再次让我惊讶吗?

编辑:接受的答案表明Haskell支持此功能,

3 个答案:

答案 0 :(得分:7)

不,Go运算符不是函数,因此没有有效的右手表达式。它们以通用方式工作,例如plus-operator适用于所有数字类型,而infix-notation也不支持la haskell。

您必须使用反射编写自己的" soft" -generic添加功能。

一种涵盖所有需求的编译语言是Haskell。

答案 1 :(得分:5)

您无法完全按照自己的意思行事,但您可以使用功能。你必须为每个操作员编写函数,但代码相对较少。

type BinaryOperator func(a, b int) int

func OpAdd(a, b int) int { return a + b }
func OpSub(a, b int) int { return a - b }

func ApplyBinaryOperator(a, b int, op BinaryOperator) int {
    return op(a, b)
}

答案 2 :(得分:0)

来自oop背景我开始这样做:

package main

import "fmt"
type MyInt int64

func (i * MyInt) Add(n MyInt) * MyInt {
    *i += n
    return i
}

func (i MyInt) String() string {
    v := int64(i)
    return fmt.Sprintf("0x%x (%d)", v, v)
}

func main() {
    x := MyInt(10)
    x.Add(10).Add(20).Add(30)
    fmt.Println("x = ", x)
}