使用自定义类型实现接口而不导入包

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用自定义类型实现接口而不导入包相关的知识,希望对你有一定的参考价值。

假设有一个第三方软件包使接口可用:

package giantpackage

type UselessInfo struct {
    wontUse     string
    alsoWontUse string
}

type CoolInterface interface {
    DoSomethingAwesome(ui UselessInfo) (string, error)
}

这样做似乎很容易实现:

package main

import giantpackage

type Jedi struct {
    name string
    age  int
}

func (j Jedi) DoSomethingAwesome(ui giantpackage.UselessInfo) (string, error)
    return "Hello world.", nil
}

假设: 1)我实际上并没有在DoSomethingAwesome函数中使用UselessInfo结构。 2)我必须导入的包是巨大的。 3)我必须导入的包不再维护,不能修改。

我的问题: 有没有办法在不导入Giantpackage的情况下实现CoolInterface?

答案

那没有。

要实现giantpackage.CoolInterface,您的类型必须具有以下方法:

DoSomethingAwesome(giantpackage.UselessInfo) (string, error)

要有一个匹配此签名的方法,您必须导入giantpackage,否则使用任何其他类型的参数,它将不匹配所需的方法。

在您的评论中,您表示您计划创建一个库,并且提供此接口的实现对于您库的某些用户来说将是一个“很好的”功能。

然后推荐的方法是创建一个库的“核心”包,它不包含这个接口实现,因此不依赖于giantpackage。您的库中不需要此功能的用户只会导入您的“核心”软件包,因此他们也不会依赖于giantpackage

创建库的另一个“扩展”包,其中包含此接口的实现(如果需要,也可以使用“核心”包)。需要它的用户也可以导入此包。

以上是关于使用自定义类型实现接口而不导入包的主要内容,如果未能解决你的问题,请参考以下文章

vscode 自定义导包失败问题

如何在 apollo 的 graphql-gql 中使用从 npm 包导入的自定义 graphQL 类型

vscode自定义问题

使用Jmeter导出导入接口自动化案例中的自定义变量

2.自定义@Excel注解实现数据Excel形式导入导出

vs code 自定义代码片段