【问题标题】:How can you have two copies of same package that cannot be used for having different namespaces如何拥有不能用于具有不同命名空间的同一包的两个副本
【发布时间】:2020-05-22 21:51:51
【问题描述】:

这是一篇博文的引述:

强制虚 URL go get 支持通过 URL 获取包

与包的 repo 的 URL 不同。这些 URL 被称为 虚 URL,并要求您提供带有特定元标记的页面 Go 工具识别。您可以使用自定义域提供包 和使用虚 URL 的路径。

例如,

$ go get cloud.google.com/go/datastore

查看源代码 https://code.googlesource.com/gocloud在幕后,把它放进去 $GOPATH/src/cloud.google.com/go/datastore 下的工作区。

鉴于 code.googlesource.com/gocloud 已在提供此软件包, 是否可以从该 URL 获取包?答案 否,如果您强制使用虚 URL。

为此,请在包中添加导入语句。 go 工具将 拒绝从任何其他路径导入此包,并将显示 对用户友好的错误。如果您不强制执行您的虚 URL, 由于您的包裹将有两份无法一起使用 到不同的命名空间。

package datastore // import "cloud.google.com/go/datastore"

谁能解释一下最后一行是什么意思?

如果您不强制使用您的个性化网址, 由于您的包裹将有两份无法一起使用 到不同的命名空间。

还是举例说明?

【问题讨论】:

  • 导入路径不同的类型是不同的类型,不管它们是否有相同的源代码。这对于 go 模块来说不再是一个真正的问题,因为模块名称定义了导入路径。

标签: go


【解决方案1】:

这很简单。

如果你的包托管在github.com/foo/bar,并且你有虚 URL foo.com/bar,那么有人可以同时做这两个:

import "github.com/foo/bar"

import "foo.com/bar"

如果你有不同的文件或包在不同的路径导入同一个包,这将是一个问题。

想象这两个文件在同一个包中:

// foo.go
package foo

import "github.com/foo/bar"

func frobnicate(x *bar.Something) { /* ... */ }
// bar.go
package foo

import "foo.com/bar"

func widget() {
    x := *bar.Something{}
    frobnicate(x) // compilation error: cannot use x (type foo.com/bar.Something) as type github.com/foo/bar.Something
}

【讨论】:

    猜你喜欢
    • 2018-01-16
    • 2011-04-10
    • 2014-01-12
    • 2020-07-13
    • 2014-09-27
    • 2011-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多