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,人傻了
1
ben1iu 296 天前
你 execTime 中 call(x,y) 这个 x y 定义在函数外了吧
|
2
liian2019 OP 知道了,内部类里面的 x,y 不是局部变量,而是使用的外部的全局变量。。。
|
4
xhatt510 296 天前
什么意思?代码没放全?
|
5
liian2019 OP @xhatt510 不是的,匿名方法定义是 func(int, int) int ,里面的方法 call(x, y)使用的不是匿名方法的入参,而是一个别的文件的 xy 变量
|
6
liian2019 OP ```go
return func(int, int) int { start := time.Now() r := call(x, y) fmt.Println("程序执行耗时", time.Since(start)) return r } ``` 话说 go 语言尽然允许这样写,那我 call 方法如何取到匿名方法的入参呢 |
8
qqqqdddd 296 天前
```
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 } } ``` |
12
realJamespond 296 天前
func execTime(call MyFunc) MyFunc {
return func(int, int) int { start := time.Now() r := call(x, y) |
13
realJamespond 296 天前
func execTime(call MyFunc) MyFunc {
return func(int, int) int { start := time.Now() r := call(x, y) 这里 x,y 没定义的话应该报错 |
14
lasuar 295 天前
业务里面禁止写这种花里胡哨的代码。
|
15
liian2019 OP @realJamespond 嗯嗯 是的 在包的别的文件定义了 xy ,我自己都搞忘了
|