随笔 - 173,  文章 - 0,  评论 - 0,  阅读 - 10万

Golang shadows是指在Go语言中,一个变量在内部作用域中被另一个同名同类型的变量声明而隐藏的情况。这种情况可能导致一些意想不到的结果,比如返回错误的值或者引用错误的变量。

复制代码
 1 func BadRead(f *os.File, buf []byte) err error {
 2   for {
 3     n, err := f.Read(buf) // shadows the function variable 'err'
 4 
 5     if err != nil {
 6       //break // causes return of wrong value
 7       return err     
 8     }
 9     foo(buf)
10   }
11   return err
12 }
复制代码

 

 for循环中的 err 被主函数在出参中已经声明过,而for循环内,进行了二次同名声明。

 且同时进行了返回,这种情况下,会触发shadows的报错。

 这个函数中,内部循环中的err变量隐藏了外部函数中的err变量,导致最后返回的是未定义的错误值。正确的做法是使用=而不是:=来赋值给已经声明的err变量。

 为了检测和避免Golang shadows,可以使用一些工具或者规范来辅助。例如:

 使用go vet -shadow命令来检测可能存在的变量隐藏。

 注意事项

 使用不同的命名风格或者前缀来区分不同作用域中的变量。

 避免在函数参数或者返回值中使用和全局变量同名的变量。

 避免在循环或者条件语句中使用:=来声明新变量,除非必要。

posted on   黑熊一只  阅读(108)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
历史上的今天:
2017-06-02 潜下心
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示