在Go中通过类型引用的方法表达式会被还原成普通函数样式,接收者是第一个参数,调用时显示传参。
示例如下:
|  1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
 | package main
type A int
func (a A) sum(b int) int {
	return int(a) + b
}
type B int
func (b B) sum() func(int) int {
	n := A(b)
	f := n.sum
	return f
}
func (b B) sum1(a int) int {
	return int(b) + a
}
func main() {
	f := B.sum
	n := f(2)(3)
	println("sum(2)(3)=", n)
	f1 := B.sum1
	n = f1(2, 3)
	println("sum(2, 3)=", n)
}
 | 
 
执行输出
| 1
2
 | sum(2)(3)= 5
sum(2, 3)= 5
 | 
 
看到这个结果,不经想起一道面试题:编写一个函数sum,使sum(2,3) 和 sum(2)(3)输出结果都是5
这道题如果用js或python很容易实现
|  1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
 | function sum() {
    var num = arguments[0];
    if(arguments.length==1){
        return function(sec){
            return num+sec;
        }
    }else{
        for(var i=1; i<arguments.length;i++){
            num += arguments[i];
        }
        return num;
    }
}
sum(2,3)
// 5
sum(2)(3)
// 5
 | 
 
在javascript 中 arguments 用在函数内部表示函数所有实参。
用python实现如下:
|  1
 2
 3
 4
 5
 6
 7
 8
 9
10
 | def sum(*args):
    if len(args) == 2:
            print args[0] + args[1]
    if len(args) == 1:
            return lambda a: a+args[0]
sum(2,3)
# 5
sum(2)(3)
# 5
 | 
 
那么在golang语言中能不能实现呢,答案是不能,Go 不支持真正的函数柯里化(Currying),
但链式调用可以像上面的示例一样,通过类型引用的方法表达式来实现。
参考