我可以在不使用点符号的情况下引用导入的类型吗

Can I reference an imported type without using dot notation

考虑以下接口定义:

package repos

import (
  resources "unit/pkg/resources"
)

type IRepo interface {
  fetch(int32) (resources.IResource, error)
  update(resources.IResource) (resources.IResource, error)
  new() resources.IResource
  create(resources.IResource) (resources.IResource, error)
  delete(int32) error
}

有没有办法 'use' 导入的包(在 C++ 命名空间的意义上),这样我就不需要在每次引用其中一种类型时都使用点符号显式命名它 ( IResource)

(TBH - 这可能只是意味着 IResource 属于 repos 包而不属于 resources

您可以使用类型别名。

type IRes = resources.IResource

与类型定义相反,别名只是同一类型的另一个名称,而不是新的不同类型。类型定义将没有 =.

您可以在 import declaration 前加上名称 . 以导入其所有标识符:

package repos

import (
  . "unit/pkg/resources"
)

然而, import . 几乎从来都不是合适的解决方案。如果将来将新标识符添加到 resources 包中,它们可能会与 repos 包中的现有标识符发生冲突并破坏您的构建。

此外,包名称与类型名称重复的事实可能表明包或包中的类型应该有一个更好的名称(参见 Package names 博客 post了解更多详情)。

在这种情况下,也许 resourcesrepos 之间的抽象边界弊大于利。您在这里处理什么 种类 的资源?可以将 Resource 类型移到某些更高级别的包中吗?


最后,我会注意到 IRepo 界面看起来非常大并且可能不合适。 Go 接口——不像 Java 接口——通常属于 使用 接口的 API,而不是 使用的 API ]提供该接口的实现。

有关该原则的更多信息,请参阅: