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 文件中访问 foobar,如下所示:

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

我很难找到一些关于 Go 语言命名空间的文档。 Go 中的命名空间是如何实现的?使用packageimport?还是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 的东西?的主要内容,如果未能解决你的问题,请参考以下文章

PHP中命名空间是怎样的存在?

适用于 Windows 和 Linux 的 Go 中的命名管道

Windows将迎来类似于macOS的代号命名法

可能的SOAP版本不匹配

在内核空间中是不是有类似于 qsort() 的函数?

php命名空间的设计思想和缺点