go-shadowsw问题小记

发布时间 2023-06-02 13:10:37作者: 黑熊一只

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

func BadRead(f *os.File, buf []byte) err error {
  for {
    n, err := f.Read(buf) // shadows the function variable 'err'
    if err != nil {
      //break // causes return of wrong value
      return err          }     foo(buf)   }   return err }

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

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

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

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

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

 注意事项

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

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

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