Go语言闭包报错‘too many arguments to return’技术求助
解决Go闭包代码的编译错误
嘿,作为Go新手碰到闭包的坑太正常了,咱们先逐个拆解你遇到的编译错误,再把代码改对:
错误原因分析
你的代码核心问题是匿名函数没有声明返回类型——Go是强类型语言,编译器需要明确知道函数的返回值类型:
- 外层的
addN匿名函数,你想让它返回一个接收int参数、返回int的函数,但没写返回类型,编译器默认它没有返回值,所以你返回func(n int){...}时就会报错“返回值过多”。 - 内层的匿名函数同理,你想返回
m+n这个整数,但没声明返回int,编译器也会抛出类似错误。 - 后面两个“used as value”的错误,本质也是因为
addN没有返回值,你却把它的调用结果赋值给变量或者直接当值用,自然不被允许。
另外还有个逻辑小问题:你想计算5+6,但直接调用addN(6)得到的是一个新的函数,不是计算结果,应该用addFive(6)来调用返回的闭包。
修正后的代码
package main func main() { // 给外层函数声明返回类型:func(int) int addN := func(m int) func(int) int { // 给内层函数声明返回类型:int return func(n int) int { return m + n } } addFive := addN(5) // 得到绑定了m=5的闭包函数 result := addFive(6) // 调用闭包,计算5+6 println(result) // 输出11 // 也可以直接链式调用:addN(5)(6) 得到同样结果 println(addN(5)(6)) }
运行结果
运行修正后的代码,会输出:
11 11
这样闭包就正确工作了——外层函数addN接收一个整数m,返回一个绑定了m值的内层函数,后续调用这个内层函数时,会用上之前绑定的m和新传入的n相加,这就是闭包“捕获外部变量”的特性啦。
内容的提问来源于stack exchange,提问作者Parikshit Singh
相关产品推荐
相关产品推荐

