Module Go和名称空间:有可能实现类似于Python的功能吗?

Module Go和名称空间:有可能实现类似于Python的功能吗?,module,namespaces,go,package,Module,Namespaces,Go,Package,我想知道是否有一种方法可以像Python那样在Go语言中使用名称空间 在Python中,如果我有以下包含函数的文件: /a.py def foo(): /b.py def bar(): 我可以在第三个Python文件中访问foo和bar,如下所示: import a a1 = a.foo() import b b1 = b.bar() 我在使用Go语言查找有关名称空间的文档时遇到了一些困难。 如何在go中实现名称空间?使用软件包和导入?或者,import专用于外部库 我想我明

我想知道是否有一种方法可以像Python那样在Go语言中使用名称空间

在Python中,如果我有以下包含函数的文件:

/a.py
    def foo():
/b.py
    def bar():
我可以在第三个Python文件中访问
foo
bar
,如下所示:

import a
a1 = a.foo()
import b
b1 = b.bar()
我在使用Go语言查找有关名称空间的文档时遇到了一些困难。 如何在go中实现名称空间?使用
软件包
导入
?或者,
import
专用于外部库


我想我明白每个包都应该有一个专用的目录。我想知道这是否绝对是强制性的,因为当高粒度的模块是设计某个想法的最佳方式时,它可能变得不切实际。换句话说,我希望避免每个包使用一个目录(供内部使用)。

Go与Python模块等效的是包。与作为单个文件存在的Python模块不同,Go包由目录表示。虽然一个简单的包在目录中可能只包含一个源文件,但较大的包可以拆分为多个文件

以Python为例,您可以创建一个包含以下内容的文件
$GOPATH/src/a/a.go

package a

import "fmt"

func Foo() {
    fmt.Println("a.Foo")
}
在主程序中,可以按如下方式调用函数:

package main

import "a"

func main() {
    a.Foo()
}
需要注意的一点是,只有
a
中导出的类型和函数在外部可用。也就是说,名称以大写字母开头的类型和函数(这就是为什么我将
foo
重命名为
foo


如果不想设置Go工作区,还可以使用相对路径进行导入。例如,如果您将主程序中的导入更改为
import./a“
,则
a
包的源代码可以位于相对于主程序的
a/a.go

它的工作原理基本相同。如果导入一个包foo,foo导出一些条,则可以像
foo.Bar()
那样访问它。我认为golang.org上的文档在这个意义上是非常清楚的。你缺少什么?我认为我理解每个包都应该有一个专用的目录。我想知道这是否绝对是强制性的,因为当高粒度的模块是设计某个想法的最佳方式时,这可能变得不切实际。当前的实现要求包的所有源文件位于同一目录中。是的!“每个目录一个包”有什么复杂之处?它非常简单,没有“但是”,没有“也许”没有“怎么样”,每个目录只有一个包。它绝对不复杂,只是闻起来像是过度冗余,特别是如果我想每个包只有一个文件的话。Go中不是真的有一个更轻量级的“名称空间”概念吗?应该注意的是,相对导入路径非常不受欢迎。只是好奇,为什么相对导入不受欢迎?目前没有使用它们,只是好奇而已thx@AlexanderMills我想工作区,尤其是基于URL的工作区,允许更多的可移植代码,因为您可以将依赖关系管理留给
go-get