本篇文章给大家谈谈go实现接口,以及go调用接口对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
今天给各位分享go实现接口的知识,其中也会对go调用接口进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录一览:
『No8: Go 接口』
大家好,我是谢伟,是一名程序员。
下面的学习是一个系列,力求从初学者的角度学会go 语言,达到中级程序员水平。
这一系列是我的输出总结,同时我还推出了视频版。正在制作过程。
为写出这些文章,我阅读了网上诸多热门的教程和纸质书籍。内容的实质都是那些,要区分出差异的话,只能表现在具体实例层面。所以,实例我会选取自己在工作中的项目实例抽取出来。希望对大家有所帮助。
我们已经研究了:
本节的主题是:接口
接口是 golang 中最值得强调的特性。它让面向对象,内容组织实现非常的方便。
接口在 go 语言中是一系列方法的集合,原则上方法可以有很多个,但建议4个左右。
上文中定义了一个 httpClient 的接口,指定了这个接口可以干这些活: Get、Post、Put、Delete
上文中指定了 httpClient 接口,指定了这个接口需要干的活是: Get、Post、Put、Delete , 具体的实现需要靠其他结构体来实现。
一个结构体实现了接口要求的所有的方法(方法的参数和返回值一致),那么就说这个结构体实现了这个接口
上文中的使用: httpClient 屏蔽了 httpImpl 的内部细节,而依然可以使用 Get 方法,去完成任务。
当然接口可以被诸多结构体实现,只需存在接口定义的几种方法即可。
接口和结构体的定义很相似,也可以完成嵌入接口的功能,嵌入的匿名的接口,可以自动的具备被嵌入的接口的方法。
结构体实现 String 方法即可实现结构化输出结构体。
实现Error 方法即可自定义错误类型。
这几个读写接口在好些库中实现了,后续我们再讨论。
Any 类型
空接口在 go 里,可以当成任意类型,意味着,比如你的函数或者方法不知道传入的参数的类型,可以直接定义为 interface{}
类型断言
类型断言的使用场景是:接口类型的变量可以包含任何类型的值。如何判断变量的真实类型?
比如解析一个不知道字段类型的 json, 常常需要使用到类型断言。
可以使用:
ok...idiom
varInterface.(T), varInterface 必须是接口、T 则是具体的实现接口的结构体
switch ..case...
.(type) 只在 switch 语句里才能使用。
以上就是接口的全部内容,接口是go 中最特别的特性。借助 接口, go 实现面向对象中的继承和多态。
接口是方法的集合,只定义具体要干什么,而怎么干,则由其他的结构体的方法实现。这样不同的结构体的方法的具体处理不同,实现的接口的功能就不一样。
尽管如此,接口并不意味着可以随意滥用。我们最好是根据面向对象的客观实体,抽象出接口和方法。
本节完,再会。
如何理解go的接口,有什么用处
如果说类是对数据和方法的抽象和封装
go实现接口,那么接口就是对类的抽象。
这里使用Java来说明,Java中的接口与`Go`中的接口是类似的,只不过Java中要显式的声明实现某个接口,而Go中不需要显式的声明实现
go实现接口了某个接口,只要实现了其中的所有方法,就默认为实现了该接口。
比如说有一个Person接口:
public interface Person{ void walk();
}
有一个Student类实现了Person接口
public class Student implements Person { //实现walk方法
@Override
public void walk(){
System.out.print("Student.walk()");
} //...其他方法}
有一个Teacher类也实现了Person接口
public class Teacher implements Person { //实现walk方法
@Override
public void walk(){
System.out.print("Teacher.walk()");
} //...其他方法}
在某个类中可以这样使用
public class SomeClass{ //这里接收一个Person类型
public static void usePerson(Person p){
p.walk()
}
public static void main(String[] args){ //可以接收任何实现了Person接口的类的对象
usePerson(new Student());
usePerson(new Teacher());
}
}
使用接口的好处是非常灵活,这样就与具体的实现做了解耦,如果以后有其他的实现类,只需要实现Person接口就可以了,而不用去改使用的时候的代码。
为什么我不喜欢Go语言式的接口
所谓Go语言式
go实现接口的接口
go实现接口,就是不用显示声明类型T实现了接口I
go实现接口,只要类型T
go实现接口的公开方法完全满足接口I的要求,就可以把类型T的对象用在需要接口I的地方。这种做法的学名叫做Structural Typing,有人也把它看作是一种静态的Duck Typing。除了Go的接口以外,类似的东西也有比如Scala里的Traits等等。有人觉得这个特性很好,但
go实现接口我个人并不喜欢这种做法,所以在这里谈谈它的缺点。当然这跟动态语言静态语言的讨论类似,不能简单粗暴的下一个“好”或“不好”的结论。
我的观点:
Go的隐式接口Duck Typing确实不是新技术, 但是在主流静态编程语言中支持Duck Typing应该是很少的(不清楚目前是否只有Go语言支持).
静态类型和动态类型虽然没有绝对的好和不好, 但是每个都是有自己的优势的, 没有哪一个可以包办一切. 而Go是试图结合静态类型和动态类型(interface)各自的优势.
那么就从头谈起:什么是接口。其实通俗的讲,接口就是一个协议,规定了一组成员,例如.NET里的ICollection接口:
public interface ICollection {
int Count { get; }
object SyncRoot { get; }
bool IsSynchronized { get; }
void CopyTo(Array array, int index);
}
这就是一个协议的全部了吗?事实并非如此,其实接口还规定了每个行为的“特征”。打个比方,这个接口的Count除了需要返回集合内元素的数目以外,还隐含了它需要在O(1)时间内返回这个要求。这样一个使用了ICollection接口的方法才能放心地使用Count属性来获取集合大小,才能在知道这些特征的情况下选用正确的算法来编写程序,而不用担心带来性能问题,这才能实现所谓的“面向接口编程”。当然这种“特征”并不但指“性能”上的,例如Count还包含了例如“不修改集合内容”这种看似十分自然的隐藏要求,这都是ICollection协议的一部分。
Go语言HTTPServer开发的六种实现
学完了 net/http 和 fasthttp 两个HTTP协议接口
go实现接口的客户端实现,接下来就要开始Server的开发,不学不知道一学吓一跳,居然这两个库还支持Server的开发,太方便了。
相比于Java的HTTPServer开发基本上都是使用Spring或者Springboot框架,总是要配置各种配置类,各种 handle 对象。Golang的Server开发显得非常简单,就是因为特别简单,或者说没有形成特别统一的规范或者框架,我发现了很多实现方式,HTTP协议基于还是 net/http 和 fasthttp ,但是 handle 语法就多种多样了。
先复习一下
go实现接口: Golang语言HTTP客户端实践 、 Golang fasthttp实践 。
在Golang语言方面,实现某个功能的库可能会比较多,有机会还是要多跟同行交流,指不定就发现了更好用的库。下面我分享我学到的六种Server开发的实现Demo。
基于 net/http 实现,这是一种比较基础的,对于接口和 handle 映射关系处理并不优雅,不推荐使用。
第二种也是基于 net/http ,这种编写语法可以很好地解决第一种的问题,handle和path有了类似配置的语法,可读性提高了很多。
第三个基于 net/http 和 github.com/labstack/echo ,后者主要提供了 Echo 对象用来处理各类配置包括接口和handle映射,功能很丰富,可读性最佳。
第四种依然基于 net/http 实现,引入了 github.com/gin-gonic/gin 的路由,看起来接口和 handle 映射关系比较明晰了。
第五种基于 fasthttp 开发,使用都是 fasthttp 提供的API,可读性尚可,handle配置倒是更像Java了。
第六种依然基于 fasthttp ,用到了 github.com/buaazp/fasthttprouter ,有点奇怪两个居然不在一个GitHub仓库里。使用语法跟第三种方式有点类似,比较有条理,有利于阅读。
golang的回调和接口
最近写了个kafka的接收消息的功能,需要使用回调处理收到的消息。
一个是基本的回调,一个是使用接口功能实现回调,对接口是个很好的学习。
1.正常回调
kafka的接收消息处。收到消息后,使用传入的Onmessage进行处理。
调用kafka接收消息的单元,并在调用方写好回调
在调用方实现回调需要执行的方法
感觉还是使用基本回调相对简单点,接口就当学习了。
另外跨包的接口的方法要大写!定位了好久发现个入门的问题。
关于go实现接口和go调用接口的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。
go实现接口的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于go调用接口、go实现接口的信息别忘了在本站进行查找喔。
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
暂时没有评论,来抢沙发吧~