一、接口定义

  • 接口类型
  1. 在讲基础数据类型时,我们曾提了一下 interface 数据类型,这个数据类型就是接口类型
  • 什么是接口
  1. Go 语言不是"传统"的面向对象的编程语言:它里面没有类的概念。
  2. 但是在go语言里有非常灵活的接口概念,通过它可以实现很多面向对象的特性。接口提供了一种方式来说明对象的行为
  3. 如果谁能搞定这家您是,他就可以用在这。
  4. 接口定义了一组方法(方法集),但是这些方法不包含(实现)代码:它们没有被实现(它们是抽象的)。接口里不能保护变量。
  • 接口定义格式
  1. type Namer interface {
  2. Method1(param_list) retrun_type
  3. Method2(param_list) retrun_type
  4. ...
  5. }
  • 接口的定义方法

    上面的Namer 是接口类型
  1. 接口的名字由接口名[e]r 后缀组成,例如Printer,Reader,Writer...
  2. 还有一种不常用的方式(当后缀er不合适是),比如Recoverable,此时接口名已able结尾,或者以I开头

二、 空接口

  • 自定义类型
  1. // 新的类型不是元类型的别名,除了拥有相同的数据㽾结构外,它们之间没有任何关系
  2. type Enum int
  3. // 可以说Enum 继承了int
  • 疑问
  1. 自定义的那些数据类型都有来源,那么那些本身就存在的数据类型(int,string..)又怎么来的呢
  • 空接口
  1. var name string = "jjj"
  2. var in interface{}
  3. in = name
  4. fmt.Println(in)
  1. 任何类型都都默认继承了空接口
  2. 所有任何类型的数据,空接口变量都可以赋值

三、接口的简单使用

  • 空接口
  1. package main
  2. import "fmt"
  3. func main(){
  4. var num int = 3
  5. var n interface{}
  6. n = num
  7. fmt.Println(n)
  8. }
  1. 结果
  2. 3
  1. 因为int实现来空接口,所以num可以赋值n
  • 自定义接口
  1. package main
  2. import "fmt"
  3. type Phone interface {
  4. Call()
  5. }
  6. type ViveoPhone struct{
  7. }
  8. func (this *ViveoPhone) Call(){
  9. fmt.Println("I am Vivo, I can call you!")
  10. }
  11. type IPhone struct{
  12. me string
  13. you string
  14. }
  15. func (iPhone *IPhone) Call(){
  16. fmt.Println("I am iPhone, I can call you!")
  17. }
  18. func main(){
  19. var phone Phone
  20. phone = &ViveoPhone{}
  21. phone.Call()
  22. phone = &IPhone{}
  23. phone.Call()
  24. }
  1. 结果
  2. I am Vivo, I can call you!
  3. I am iPhone, I can call you!
  1. 因为VivePhone IPhone 这两个结构体 实现Phone所以接口方法,所以默认这两个结构体实现来该接口

四、接口的实现

  1. package main
  2. import(
  3. "fmt"
  4. )
  5. type Car interface{
  6. Run()
  7. }
  8. type Bike struct{
  9. Type string
  10. }
  11. func (b *Bike) Run(){
  12. fmt.Printf("this is bike of %s\n",b.Type)
  13. }
  14. type Bus struct{
  15. Body_num int
  16. }
  17. func (b *Bus) Run(){
  18. fmt.Printf("bus working,There are currently %d people\n",b.Body_num)
  19. }
  20. func main(){
  21. var car Car
  22. car = &Bike{"马自达"}
  23. car.Run()
  24. car = &Bus{23}
  25. car.Run()
  26. }
  1. 结果:
  2. this is bike of 马自达
  3. bus working,There are currently 23 people

五、接口嵌套

  1. 一个接口可以包含一个或多个其他的接口,这相当于直接将这些内嵌接口的方法列举在外层接口中一样
  2. 比如接口 File 包含了 ReadWrite Lock 的所有方法,它还额外有一个 Close() 方法。
  1. type ReadWrite interface {
  2. Read(b Buffer) bool
  3. Write(b Buffer) bool
  4. }
  5. type Lock interface {
  6. Lock()
  7. Unlock()
  8. }
  9. type File interface {
  10. ReadWrite
  11. Lock
  12. Close()
  13. }

六、注意

  1. 1、结构体实现来接口的所以方法,即表示结构体实现了该接口。(这种实现方法是隐式实现)
  2. 2、所有的类型都默认实现了空接口,所以所有类型的变量都可以赋值给空接口变量

go的接口的更多相关文章

  1. App开发:模拟服务器数据接口 - MockApi

    为了方便app开发过程中,不受服务器接口的限制,便于客户端功能的快速测试,可以在客户端实现一个模拟服务器数据接口的MockApi模块.本篇文章就尝试为使用gradle的android项目设计实现Moc ...

  2. 干货来袭-整套完整安全的API接口解决方案

    在各种手机APP泛滥的现在,背后都有同样泛滥的API接口在支撑,其中鱼龙混杂,直接裸奔的WEB API大量存在,安全性令人堪优 在以前WEB API概念没有很普及的时候,都采用自已定义的接口和结构,对 ...

  3. 12306官方火车票Api接口

    2017,现在已进入春运期间,真的是一票难求,深有体会.各种购票抢票软件应运而生,也有购买加速包提高抢票几率,可以理解为变相的黄牛.对于技术人员,虽然写一个抢票软件还是比较难的,但是还是简单看看123 ...

  4. Java基础Map接口+Collections工具类

    1.Map中我们主要讲两个接口 HashMap  与   LinkedHashMap (1)其中LinkedHashMap是有序的  怎么存怎么取出来 我们讲一下Map的增删改查功能: /* * Ma ...

  5. Java基础Map接口+Collections

    1.Map中我们主要讲两个接口 HashMap  与   LinkedHashMap (1)其中LinkedHashMap是有序的  怎么存怎么取出来 我们讲一下Map的增删改查功能: /* * Ma ...

  6. java基础_集合List与Set接口

    List接口继承了Collection的方法  当然也有自己特有的方法向指定位置添加元素   add(索引,添加的元素); 移除指定索引的元素   remove(索引) 修改指定索引的元素   set ...

  7. 【WCF】自定义错误处理(IErrorHandler接口的用法)

    当被调用的服务操作发生异常时,可以直接把异常的原始内容传回给客户端.在WCF中,服务器传回客户端的异常,通常会使用 FaultException,该异常由这么几个东东组成: 1.Action:在服务调 ...

  8. PHP以接口方式实现多重继承(完全模拟)--学习笔记

     1.UML类图: 2.PHP代码: <?php /** * Created by PhpStorm. * User: andy * Date: 16-11-23 * Time: 下午7:57 ...

  9. 【微框架】Maven +SpringBoot 集成 阿里大鱼 短信接口详解与Demo

    Maven+springboot+阿里大于短信验证服务 纠结点:Maven库没有sdk,需要解决 Maven打包找不到相关类,需要解决 ps:最近好久没有写点东西了,项目太紧,今天来一篇 一.本文简介 ...

  10. 【接口开发】浅谈 SOAP Webserver 与 Restful Webserver 区别

    接口,强大,简单,交互,跨越平台 下面简单阐述这两大接口思想 一 REST: REST是一种架构风格,其核心是面向资源,REST专门针对网络应用设计和开发方式,以降低开发的复杂性,提高系统的可伸缩性. ...

随机推荐

  1. jquery ajax中各个事件执行顺序如下

    $(function(){ setTimeout(function(){ $.ajax({ url:'/php/selectStudent.php', }); },0); $(document).aj ...

  2. jquery动态生成二维码添加自定义logo

    动态生成二维码中间带logo. jquery.qrcode.js 动态生成二维码api很简单. 引入jquer(版本任意),引入jquery.qrcode.js 不需要中间带logo这样就可以了.带l ...

  3. python之BeautifulSoup库

    1. BeautifulSoup库简介 和 lxml 一样,Beautiful Soup 也是一个HTML/XML的解析器,主要的功能也是如何解析和提取 HTML/XML 数据.lxml 只会局部遍历 ...

  4. JavaScript day3(数据类型)

    数据类型(data type) JavaScript提供七种不同的数据类型(data types),它们是string(字符串), symbol(符号), number(数字), undefined( ...

  5. web前端学习总结--CSS

    CSS 什么是CSS? CSS 指层叠样式表(Cascading Style Sheets) 样式定义如何显示HTML元素 样式通常存储在样式表中 如何使用CSS 内联方式 样式定义在单个的HTML元 ...

  6. Linux之日志管理

    日志介绍日志配置日志管理远程日志基于MYSQL的日志 日志介绍日志:历史事件:时间,地点,人物,事件日志级别:事件的关键性程度,Loglevel系统日志服务:sysklogd :CentOS 5之前版 ...

  7. iptables简单了解

    简介 Iptables是unix/linux自带的一款优秀且开源的基于包过滤的防火墙工具. 怎么用 可以用来做主机防火墙. 可以做局域网共享上网. 可以做ip及端口映射. Iptables工作流程 i ...

  8. Python爬虫基础--分布式爬取贝壳网房屋信息(Server)

    1. server_code01 2. server_code02 3. server_code03

  9. 对vuex的浅解

    vuex是什么? 官网的解释是 Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化.Vuex 也 ...

  10. 编译器错误消息: CS0016: 未能写入输出文件“c:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\root\64b7b75e\4dfbfca6\App_Web_company.master.4611739e.l3t-kpke.dll”--“拒绝访问。 ”

    报错 原因:IIS没有权限操作TEMP文件夹 最后重新启动站点