在Go中从本地var中消除包名称的歧义

Lan*_*der 8 package go

有没有一种好的方法可以消除程序包名称和局部变量之间的歧义?如果不需要,我不想重构导入名称或变量名称。以...为例

import "path"

func foo() {
    path := "/some/path"
    // Disambiguate here
    path.Join(path, "/some/other/path")
}
Run Code Online (Sandbox Code Playgroud)

Eve*_*man 7

局部变量始终在此处覆盖(阴影)程序包。选择另一个变量名,或为程序包加上其他别名:

http://play.golang.org/p/9ZaJa5Joca

要么

http://play.golang.org/p/U6hvtQU8dx

参见其他答案中的nemo替代品。我认为最可维护的方法是选择一个与程序包名称不重叠的变量名。


nem*_*emo 5

我能想到的还有两个额外的选择:

  1. 存储path.Join在变量中
  2. 制作path一个实现的类型Join

第一个很简单。而不是在声明之前path.Join存储path.Join在变量中path并改为调用它(play):

join := path.Join

path := "/some/path"
path = join("/some/other/path")
Run Code Online (Sandbox Code Playgroud)

第二个有点复杂,我认为您实际上不应该这样做,但这是一种可能性(play):

type Path string

func (p Path) Join(elem ...string) string {
    return path.Join(append([]string{string(p)}, elem...)...)
}

fmt.Println("Hello, playground")

path := "/some/path"

path = Path(path).Join("/some/other/path")
Run Code Online (Sandbox Code Playgroud)

  • +1。聪明 :PI 仍然认为维护这样的代码令人困惑。最干净的方法(IMO)是选择一个不同的变量名。 (3认同)