当多个结构在golang中有几个常见函数时,最佳实践是什么

时间:2018-01-17 07:46:15

标签: go design-patterns interface

我有3个类,它们在不同的函数中实现了几个操作步骤。例如,

func ExternalAPI1() error
func ExternalAPI2(s string)
func internalProcess1() error
func internalProcess2(s []string) error 
func internalProcess3(d int) error

对于 internalProcessx ,它们是内部函数,可能不会被其他类调用,但这些函数具有相同的签名。 我应该为他们生成一个只包含 ExternalAPI1 ExternalAPI2 的界面吗?或者我应该在界面中包含所有这5个功能吗?

3 个答案:

答案 0 :(得分:3)

tl; dr:在创建结构时不要担心接口,在创建消耗它们的函数时要担心接口。

这个问题忽略了一个重要的基本问题:你是否需要一个界面?是的,是接受接口类型的值,并在不知道底层类型的情况下对它们进行操作?如果是这样,它将在值上调用的方法? 那些是应该在界面中的方法。

请记住,Go使用duck接口;因此,应该定义接口以适合消费者,实现。实际上,它们通常应该与消费者一起定义,而不是实现,因为实现不需要知道它实现的接口。

在Go中,当一个函数或方法可以对任何实现方法X"的东西进行操作时,除了该函数或方法之外,还可以定义一个" Xer"与该方法签名的接口。这允许将任何内容传递给满足接口的函数,并且函数不需要担心底层类型是什么。

答案 1 :(得分:1)

如果您希望编译器强制实现接口的所有结构都具有未导出的方法,那么未导出的方法肯定可以包含在接口中。

reflect.Type是stdlib(see here, godoc notes that the interface contains unexported methods

中的一个示例

答案 2 :(得分:0)

接口描述执行特定操作所需的方法。在您的情况下,这肯定是以下几点:

type API interface {
    ExternalAPI1() error
    ExternalAPI2(s string)
}

但请注意,在同一个软件包中直接使用 struct (非类)时,这并不限制使用非导出方法。