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

19 回复

你 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)

func execTime(call MyFunc) MyFunc {
return func(int, int) int {
start := time.Now()
r := call(x, y)

这里 x,y 没定义的话应该报错

业务里面禁止写这种花里胡哨的代码。

嗯嗯 是的 在包的别的文件定义了 xy ,我自己都搞忘了

跟着学的哈哈,业务里面感觉一些通用的工具包应该这样写问题也不大

业务代码和工具包有着根本的区别,前者是需要经常阅读和偶尔修改的,后者基本不需要你做修改亦不关心可读性。可以掌握,但注意使用场景。

当然,我很乐意帮你看看代码问题。不过由于你未直接贴出代码,我将根据常见的新手错误给出一些可能的指导。

在Golang(通常简称为Go)中,新手常犯的错误可能包括:

  1. 变量声明和初始化:确保在使用变量前已正确声明并初始化。Go是静态类型语言,未初始化的变量在使用时会引发编译错误。

  2. 函数和方法的调用:检查函数或方法调用时参数的数量和类型是否正确。特别注意切片、映射和接口的传递方式。

  3. 并发编程:如果使用goroutines和channels,确保正确管理并发逻辑,避免竞态条件。使用sync包中的工具如sync.Mutexsync.WaitGroup来协调多个goroutine。

  4. 错误处理:Go鼓励显式错误处理。确保所有可能返回错误的函数调用都进行了错误检查。

  5. 内存管理:虽然Go有垃圾回收机制,但不当的引用可能导致内存泄漏。注意及时关闭不再需要的文件、网络连接等资源。

  6. 包和依赖管理:确保正确导入和使用第三方包。使用Go Modules来管理项目依赖。

  7. 格式和风格:遵循Go的编码规范,使用gofmt工具来格式化代码。

如果具体代码存在问题,请贴出代码片段,这样我可以提供更精确的帮助。

回到顶部