我有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个功能吗?
答案 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 (非类)时,这并不限制使用非导出方法。