Golang Go语言中刚学,请大家帮忙看看我下面这段代码问题是什么
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,人傻了
Golang Go语言中刚学,请大家帮忙看看我下面这段代码问题是什么
更多关于Golang Go语言中刚学,请大家帮忙看看我下面这段代码问题是什么的实战教程也可以访问 https://www.itying.com/category-94-b0.html
你 execTime 中 call(x,y) 这个 x y 定义在函数外了吧
更多关于Golang Go语言中刚学,请大家帮忙看看我下面这段代码问题是什么的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
知道了,内部类里面的 x,y 不是局部变量,而是使用的外部的全局变量。。。
是的是的,感谢大佬
什么意思?代码没放全?
不是的,匿名方法定义是 func(int, int) int ,里面的方法 call(x, y)使用的不是匿名方法的入参,而是一个别的文件的 xy 变量
go<br>return func(int, int) int {<br> start := time.Now()<br> r := call(x, y)<br> fmt.Println("程序执行耗时", time.Since(start))<br> return r<br> }<br>
话说 go 语言尽然允许这样写,那我 call 方法如何取到匿名方法的入参呢
#6
对 call 这个 function 是没有任何区别的。
<br>package main<br><br>import (<br> "fmt"<br> "time"<br>)<br><br>func main() {<br> wrapper := execTime(calc3)<br> r := wrapper(1, 2)<br> fmt.Println("计算结果为", r)<br> fmt.Println("计算结果 2 为", calc3(1, 2))<br>}<br><br>type MyFunc func(int, int) int<br><br>func calc3(x, y int) int {<br> return x + y<br>}<br><br>func execTime(call MyFunc) MyFunc {<br> return func(x, y int) int {<br> start := time.Now()<br> r := call(x, y)<br> fmt.Println("程序执行耗时", time.Since(start))<br> return r<br> }<br>}<br><br>
嗯嗯 已经知道原因了谢谢
#5 那不就是没给全吗?
本意是用匿名方法的入参,不知道外部也正好有 xy 这两个参数
func execTime(call MyFunc) MyFunc {
return func(int, int) int {
start := time.Now()
r := call(x, y)
业务里面禁止写这种花里胡哨的代码。
嗯嗯 是的 在包的别的文件定义了 xy ,我自己都搞忘了
跟着学的哈哈,业务里面感觉一些通用的工具包应该这样写问题也不大
业务代码和工具包有着根本的区别,前者是需要经常阅读和偶尔修改的,后者基本不需要你做修改亦不关心可读性。可以掌握,但注意使用场景。
嗯嗯