为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
烙印99 2023-03-29 15:30:38
在 GoLang 中,可以使用函数作为参数,例如在这个简单的例子中,根据小于或等于 ( )<=或大于或等于运算符 ( >=)比较两个数字package mainfunc 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}
查看完整描述

1 回答

?
慕虎7371278

TA贡献1802条经验 获得超4个赞

不,根据Go 语言规范,这不是一个正确的程序。


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

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

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

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

此外,函数调用规范要求调用中的参数是单值表达式。二元运算符本身不是表达式。

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


查看完整回答
反对 回复 2023-03-29
  • 1 回答
  • 0 关注
  • 118 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信