刚学 go 语言,请大家帮忙看看我下面这段代码问题是什么

305 天前
 liian2019
type MyFunc func(int, int) int

func calc3(x, y int) int {
	return x + y
}

func execTime(call MyFunc) MyFunc {
	return func(int, int) int {
		start := time.Now()
		r := call(x, y)
		fmt.Println("程序执行耗时", time.Since(start))
		return r
	}
}

func TestFuncLearn(t *testing.T) {
	wrapper := execTime(calc3)
	r := wrapper(1, 2)
	fmt.Println("计算结果为", r)
	fmt.Println("计算结果 2 为", calc3(1, 2))
}

执行结果..

=== RUN   TestFuncLearn
程序执行耗时 125ns
计算结果为 5
计算结果 2 为 3
--- PASS: TestFuncLearn (0.00s)
PASS

请问一下问什么执行结果是 5 呢,debug 进去,x=2 ,y=3,人傻了

2277 次点击
所在节点    Go 编程语言
18 条回复
ben1iu
305 天前
你 execTime 中 call(x,y) 这个 x y 定义在函数外了吧
liian2019
305 天前
知道了,内部类里面的 x,y 不是局部变量,而是使用的外部的全局变量。。。
liian2019
305 天前
@ben1iu 是的是的,感谢大佬
xhatt510
305 天前
什么意思?代码没放全?
liian2019
305 天前
@xhatt510 不是的,匿名方法定义是 func(int, int) int ,里面的方法 call(x, y)使用的不是匿名方法的入参,而是一个别的文件的 xy 变量
liian2019
305 天前
```go
return func(int, int) int {
start := time.Now()
r := call(x, y)
fmt.Println("程序执行耗时", time.Since(start))
return r
}
```
话说 go 语言尽然允许这样写,那我 call 方法如何取到匿名方法的入参呢
flyqie
305 天前
@liian2019 #6

对 call 这个 function 是没有任何区别的。
qqqqdddd
305 天前
```
package main

import (
"fmt"
"time"
)

func main() {
wrapper := execTime(calc3)
r := wrapper(1, 2)
fmt.Println("计算结果为", r)
fmt.Println("计算结果 2 为", calc3(1, 2))
}

type MyFunc func(int, int) int

func calc3(x, y int) int {
return x + y
}

func execTime(call MyFunc) MyFunc {
return func(x, y int) int {
start := time.Now()
r := call(x, y)
fmt.Println("程序执行耗时", time.Since(start))
return r
}
}

```
liian2019
305 天前
@qqqqdddd 嗯嗯 已经知道原因了谢谢
xhatt510
305 天前
@liian2019 #5 那不就是没给全吗?
liian2019
305 天前
@xhatt510 本意是用匿名方法的入参,不知道外部也正好有 xy 这两个参数
realJamespond
304 天前
func execTime(call MyFunc) MyFunc {
return func(int, int) int {
start := time.Now()
r := call(x, y)
realJamespond
304 天前
func execTime(call MyFunc) MyFunc {
return func(int, int) int {
start := time.Now()
r := call(x, y)

这里 x,y 没定义的话应该报错
lasuar
304 天前
业务里面禁止写这种花里胡哨的代码。
liian2019
298 天前
@realJamespond 嗯嗯 是的 在包的别的文件定义了 xy ,我自己都搞忘了
liian2019
298 天前
@lasuar 跟着学的哈哈,业务里面感觉一些通用的工具包应该这样写问题也不大
lasuar
298 天前
@liian2019 业务代码和工具包有着根本的区别,前者是需要经常阅读和偶尔修改的,后者基本不需要你做修改亦不关心可读性。可以掌握,但注意使用场景。
liian2019
296 天前
@lasuar 嗯嗯

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1018511

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX