Go和名称空间:是否有可能实现与Python类似的东西?

时间:2014-04-10 15:01:15

标签: module namespaces go package

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

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

/a.py
    def foo():
/b.py
    def bar():

我可以在第三个Python文件中访问foobar,如下所示:

import a
a1 = a.foo()
import b
b1 = b.bar()

我在使用Go语言查找名称空间的文档时遇到了一些困难。 如何实现命名空间?使用packageimport?或import致力于外部图书馆?

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

1 个答案:

答案 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相对于主程序。