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

fst*_*tab 7 namespaces module package go

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

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

/a.py
    def foo():
/b.py
    def bar():
Run Code Online (Sandbox Code Playgroud)

我可以访问foo,并bar在第三Python的文件如下:

import a
a1 = a.foo()
import b
b1 = b.bar()
Run Code Online (Sandbox Code Playgroud)

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

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

Jam*_*dge 12

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

因此,要获取Python示例,您可以创建$GOPATH/src/a/a.go包含以下内容的文件:

package a

import "fmt"

func Foo() {
    fmt.Println("a.Foo")
}
Run Code Online (Sandbox Code Playgroud)

在您的主程序中,您可以像这样调用函数:

package main

import "a"

func main() {
    a.Foo()
}
Run Code Online (Sandbox Code Playgroud)

需要注意的一点是,只有a外部输出的类型和功能才可用.也就是说,类型和函数名称以大写字母开始(这就是为什么我改名fooFoo).

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

  • 应该指出的是,相反的进口路径是非常不鼓励的. (4认同)