Go 和命名空间:是不是有可能实现类似于 Python 的东西?
Posted
技术标签:
【中文标题】Go 和命名空间:是不是有可能实现类似于 Python 的东西?【英文标题】:Go and namespaces: is it possible to achieve something similar to Python?Go 和命名空间:是否有可能实现类似于 Python 的东西? 【发布时间】:2014-05-24 09:09:38 【问题描述】:我想知道是否有一种方法可以像 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 中的命名空间是如何实现的?使用package
和import
?还是import
专用于外部库?
我想我理解每个包都应该有一个专用目录。我想知道这是否是绝对强制性的,因为只要高粒度的模块是设计某个想法的最佳方式,它就会变得不切实际。换句话说,我想避免每个包使用一个目录(供内部使用)。
【问题讨论】:
它的工作原理基本相同。如果你导入一个包 foo 并且 foo 导出一些 Bar,你可以像foo.Bar()
一样访问它。我认为 golang.org 上的文档在这方面非常清楚。你错过了什么?
我想我明白每个包都应该有一个专用目录。我想知道这是否是绝对强制性的,因为只要高粒度的模块是设计某个想法的最佳方式,它就会变得不切实际
当前实现要求包的所有源文件都位于同一目录中。
是的! “一个目录一个包”有什么复杂的?这很简单,没有“但是”,没有“也许”,没有“怎么样”,每个目录只有一个包。
这绝对不复杂,只是闻起来像过度冗余,特别是如果我想每个包只有一个文件。 Go 中真的没有更轻量级的“命名空间”概念吗?
【参考方案1】:
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
。
【讨论】:
应该注意的是,相对导入路径是非常不鼓励的。 只是好奇,为什么不鼓励相对进口?目前没有使用它们,只是好奇thx @AlexanderMills 我猜工作区,尤其是基于 URL 的工作区允许更多可移植代码,因为您可以将依赖项管理留给go get
。以上是关于Go 和命名空间:是不是有可能实现类似于 Python 的东西?的主要内容,如果未能解决你的问题,请参考以下文章