[接口|青训营阅读笔记]

43 阅读2分钟

这是我参与「第五届青训营」伴学笔记创作活动的第10天

接口

接口又称为动态数据类型,在进行接口使用的的时候,会将接口对位置的动态类型改为所指向的类型 会将动态值改成所指向类型的结构体 第一,接口的意义是什么?

我觉得大概就是抽象一个层,让使用者关注”这个东西怎么用“,而不用关注具体是什么吧,统一的接口也可以让你的程序拆装更方便(比如你用个Parser接口来解析配置文件,下面可以挂XmlParser,也可以挂TomlParser,而使用者的代码不需要跟着变)

第二,go的接口实现方式和其他的不同

传统的像java的侵入式接口,类需要显式实现接口,所以可以看做是先有接口再有实现,这会有一个问题,就是实现某个功能时候,可能会被当时的接口需求约束住,反过来如果没有接口方面的需求,则一个类库很难确定自己应该提供什么接口出去,因为外面的需求是未知的,你也不可能提供所有可能的接口出去,因为数量是2^N

而go的非侵入式接口就将接口的定义和责任转移到使用者这头,实现功能的人不需要关心别人想怎么用,他只要告诉别人自己的东西可以怎么用就行了,使用者如果想简单地用这个功能,就直接用(比如直接用XmlParser),如果想抽象,就自己去抽象(自己定义Parser接口然后把XmlParser挂进来)

接口被实现的条件一:接口的方法与实现接口的类型方法格式一致

接口被实现的条件二:接口中所有方法均被实现

定义接口

type interface_name interface {  
   method_name1 [return_type]  
   method_name2 [return_type]  
   method_name3 [return_type]  
   ...  
   method_namen [return_type]  
}  

定义结构体

type struct_name struct {  
   /* variables */  
}  

实现接口方法

func (struct_name_variable struct_name) method_name1() [return_type] {  
   /* 方法实现 */  
}  
...  
func (struct_name_variable struct_name) method_namen() [return_type] {  
   /* 方法实现*/  
}