如何在 Go 中使用中缀(比较)运算符作为参数
How to Use Infix (Comparison) operators as parameters in Go
在 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 language specification,这不是一个正确的程序。
函数类型是defined,除了其他术语外,还包含一个参数列表,每个参数列表由一个参数声明组成:[ IdentifierList ] [ "..." ] Type
.
这要求函数的所有参数都具有类型,指定为产生式 Type
,因此:
TypeLit = ArrayType | StructType | PointerType | FunctionType | InterfaceType |
SliceType | MapType | ChannelType
内置操作数(例如相等和比较运算符)是语言内部的,不会在此处公开为可能的类型文字。
此外,specification for function calls requires that arguments in a call are single-valued expressions. Binary operators are not themselves expressions.
因此,您不能将 "infix" 运算符作为参数传递给函数调用。您应该定义自己的接口或函数类型来包装运算符,并将其传递给您的比较函数。
在 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 language specification,这不是一个正确的程序。
函数类型是defined,除了其他术语外,还包含一个参数列表,每个参数列表由一个参数声明组成:[ IdentifierList ] [ "..." ] Type
.
这要求函数的所有参数都具有类型,指定为产生式 Type
,因此:
TypeLit = ArrayType | StructType | PointerType | FunctionType | InterfaceType |
SliceType | MapType | ChannelType
内置操作数(例如相等和比较运算符)是语言内部的,不会在此处公开为可能的类型文字。
此外,specification for function calls requires that arguments in a call are single-valued expressions. Binary operators are not themselves expressions.
因此,您不能将 "infix" 运算符作为参数传递给函数调用。您应该定义自己的接口或函数类型来包装运算符,并将其传递给您的比较函数。