如何在Go中使用中缀(比较)运算符作为参数

问题描述 投票:0回答:1

在GoLang中,可以使用函数作为参数,例如在这个简单的示例中,它基于小于或等于(<=)或大于或等于运算符(>=)来比较两个数字

package main

func leq(x, y int) bool {
    return x <= y
}

func geq(x, y int) bool {
    return x >= y
}

func compare(x, y int, comparator func(int, int) bool) bool {
    return comparator(x, y)
}

func main() {
    println(compare(3, 5, leq)) //true
    println(compare(5, 3, leq)) //false
    println(compare(3, 5, geq)) //false
    println(compare(5, 3, geq)) //true
}

有没有办法让中缀运算符而不是函数作为函数参数?

如:

func compare(x, y int, comparator <something here>) bool {
    return comparator(x, y)
}

func main() {
    println(compare(3, 5, <=)) //true
    println(compare(5, 3, <=)) //false
    println(compare(3, 5, >=)) //false
    println(compare(5, 3, >=)) //true
}

或者,我是最好的选择,就像在第一个例子中为运营商编写包装器一样?

另外,如果以上是可能的,是否可以使用带有中缀语法的中缀运算符参数?如

func compare(x, y int, c <something here>) bool {
    return x c y
}
go parameters parameter-passing infix-operator
1个回答
1
投票

不,根据Go language specification,这不是一个正确的程序。


函数类型是defined,其中包含一个参数列表,每个参数都包含一个参数声明:[ IdentifierList ] [ "..." ] Type

这要求函数的所有参数都有类型,指定为生产Type,因此:

TypeLit = ArrayType | StructType | PointerType | FunctionType | InterfaceType |
          SliceType | MapType | ChannelType

内置操作数(例如相等和比较运算符)是语言内部的,在此不作为可能的类型文字公开。

而且,specification for function calls要求调用中的参数是单值表达式。二元运算符是not themselves expressions

因此,您不能将“中缀”运算符作为函数调用的参数传递。您应该定义自己的包装操作符的接口或函数类型,并将其传递给比较函数。

© www.soinside.com 2019 - 2024. All rights reserved.