在Go中消除包名与本地变量之间的歧义

在Go中消除包名与本地变量之间的歧义,go,package,Go,Package,有没有一种消除包名和局部变量之间歧义的好方法?如果不需要的话,我宁愿不重构导入名或变量名。例如 import "path" func foo() { path := "/some/path" // Disambiguate here path.Join(path, "/some/other/path") } 局部变量始终覆盖(阴影)此处的包。选择另一个变量名,或将包别名为其他名称: 或 请参见另一个答案中的尼莫替代方案。我认为最容易维护的方法是选择一个不会与包名重

有没有一种消除包名和局部变量之间歧义的好方法?如果不需要的话,我宁愿不重构导入名或变量名。例如

import "path"

func foo() {
    path := "/some/path"
    // Disambiguate here
    path.Join(path, "/some/other/path")
}

局部变量始终覆盖(阴影)此处的包。选择另一个变量名,或将包别名为其他名称:


请参见另一个答案中的尼莫替代方案。我认为最容易维护的方法是选择一个不会与包名重叠的变量名。

我可以想到另外两个选项:

  • 存储路径。在变量中加入
  • 使
    path
    成为实现
    Join
  • 第一点很简单。代替
    path.Join
    您将
    path.Join
    存储在变量中,然后声明
    path
    并调用它():

    第二个有点复杂,我不认为你真的应该这么做,但这是可能的 ():


    我也不希望这样做。。。但看来我不得不这么做了。谢谢。聪明的:P我仍然认为像这样维护代码是令人困惑的。最干净的方法(IMO)是选择一个不同的变量名。我同意。这更像是最后的手段:)危险!这回答了你的问题吗@克拉夫米尔这个问题在7年前得到了回答。
    join := path.Join
    
    path := "/some/path"
    path = join("/some/other/path")
    
    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")