Go 在不知道自己是否在围棋包中的情况下引用围棋包中的符号?

Go 在不知道自己是否在围棋包中的情况下引用围棋包中的符号?,go,name-lookup,Go,Name Lookup,假设包a中有一个函数F,我正在创建的一些代码需要调用它。我怎么称呼它 如果我从A包外部调用它,那么我使用A.F.。如果我在A包内部,我使用F。。。。但如果Murphy阻止我知道哪一个是真的,或者两个都需要一个字节相同的行呢 [注:我认为这种情况会发生,因为根据我的经验和观察,这通常是一个安全的假设。即使没有技术上的原因,s和立法者也是荒谬的好来源。]没有这样的语法。注意以下几点: 禁止周期性进口。这尤其意味着包无法导入自身。因此,包不能使用pkg.S语法引用其符号之一,因为它将无法导入自身。 即

假设包a中有一个函数F,我正在创建的一些代码需要调用它。我怎么称呼它

如果我从A包外部调用它,那么我使用A.F.。如果我在A包内部,我使用F。。。。但如果Murphy阻止我知道哪一个是真的,或者两个都需要一个字节相同的行呢


[注:我认为这种情况会发生,因为根据我的经验和观察,这通常是一个安全的假设。即使没有技术上的原因,s和立法者也是荒谬的好来源。]

没有这样的语法。注意以下几点:

禁止周期性进口。这尤其意味着包无法导入自身。因此,包不能使用pkg.S语法引用其符号之一,因为它将无法导入自身。 即使您解决了这个问题,也要注意,一旦导入包,就可以为包指定任意名称。例如,您可以执行以下操作:

import bar "foo"
它以bar.S的形式从包foo导入S,而不是预期的foo.S

以下内容可用于解决此问题:

在包foo中,创建一个内部对象foo,其成员是foo导出的符号。这允许您在foo本身中使用foo.S语法,但这是一个可怕的难题。 使用导入声明,如

import . "foo"
它允许您使用包foo中的符号S作为S,i。 E没有前缀。请注意,这种称为点导入的导入声明被认为是错误的样式,如果您声明的符号集/您导入的包声明发生更改,则可能会破坏样式


你不能在围棋语言中总是使用A.F吗?为什么在编译时你不知道呢?不能。不管怎么说,Go用户似乎还是过得去从A内部的A.F指的是不存在的A.A.F我问这个问题主要是出于好奇,关于围棋是否包括一个逃生舱,或者它是否假设世界总是符合它的期望。这个问题似乎离题了,因为它是关于宇宙的基本反常性。恶心。为什么它不只是有一个FQN锚,例如C++@BCS中的前缀::为什么它应该?这只是在C++中需要的,因为C++允许任意的事物具有名称空间。在Go中,文件中的名称空间永远不会改变,那么为什么要有这样的语法呢?也没有预处理器,所以原因就更少了。在我只需要担心技术限制的罕见情况下,你可能是对的。但在一般情况下…@BCS在什么一般情况下?我不理解你的问题。在一般情况下,法律、金钱和PHB比编程语言所允许的更能约束事情。