我想知道是否有一种方法可以像Go语言一样在Go语言中使用名称空间。
在Python中如果我有以下包含函数的文件:
/a.py
def foo():
/b.py
def bar():
我可以在第三个Python文件中访问foo
和bar
,如下所示:
import a
a1 = a.foo()
import b
b1 = b.bar()
我在使用Go语言查找名称空间的文档时遇到了一些困难。
如何实现命名空间?使用package
和import
?或import
致力于外部图书馆?
我想我明白每个包都应该有一个专用目录。我想知道这是否绝对是强制性的,因为只要高粒度的模块是设计某个想法的最佳方式,它就变得不切实际。换句话说,我想避免每个包使用一个目录(供内部使用)。
答案 0 :(得分:11)
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
相对于主程序。