2019独角兽企业重金招聘Python工程师标准>>>

Golang接口定义使用interface来声明,它相对于其他语言最大的特定就是接口定义和实现的关联性仅仅依赖接口的名字和声明,无需显式声明。

  1. 接口定义和实现 在下面这个例子中,定义了两个自定义类型city country 和接口类型IName city、country分别实现了接口IName, 它们不需要代码上不需要去和IName关联(比如implement IName),只需要实现 IName定义的方法即可。接口更像是双方约定的协议,达到更加精炼、灵活的效果。

  2. 空接口:interface{} 它不包含任何的方法,所以类型都实现了空接口。空接口在我们需要存储任意类型的时候相当有用,非常类似C语言中void* 类型。printname 函数中输入参数就是一个空接口

  3. 接口检查 有时候需要检查某个obj是否实现了接口,可以用obj.(I)来查询它是否实现了接口 printname中 ivalue, ok := p.(IName) if !ok { fmt.Println("It is not a IName interface obj:", p) return }

  4. 接口类型 由于实现接口的obj可能有多个,如果需要确切知道是哪一个,可以使用 obj.(type)来判断。 这里有两个实现IName接口的struct, printname 中就是通过obj.(type) 来判断是city 还是country.

Code:

package mainimport ("fmt"
)type city struct {name string
}func (c city) Put(name string) {c.name = name
}func (c city) GetName() string {return c.name
}type country struct {name string
}func (c country) Put(name string) {c.name = name
}func (c country) GetName() string {return c.name
}type IName interface {Put(string)GetName() string
}//interface type and query
func printname(p interface{}) {ivalue, ok := p.(IName)if !ok {fmt.Println("It is not a IName interface obj:", p)return}switch ivalue.(type) {case *city:fmt.Println("It is a *city: ", ivalue.GetName())case *country:fmt.Println("It is a *country: ", ivalue.GetName())case city:fmt.Println("It is a city: ", ivalue.GetName())case country:fmt.Println("It is a country: ", ivalue.GetName())default:fmt.Println("It is other IName interface")}}func main() {var c1, c2, c3, c4 interface{}c1 = city{name: "Hangzhou"}c2 = country{name: "US"}c3 = &city{name: "Shanghai"}c4 = &country{name: "Japan"}fmt.Println(c1)fmt.Println(c2)fmt.Println(c3)fmt.Println(c4)//print name of object has interface INameprintname(c1)printname(c2)printname(c3)printname(c4)//print name of object not has interface INameprintname(10)printname("abc")
}

Output:

{Hangzhou}
{US}
&{Shanghai}
&{Japan}
It is a city:  Hangzhou
It is a country:  US
It is a *city:  Shanghai
It is a *country:  Japan
It is not a IName interface obj: 10
It is not a IName interface obj: abc

code : https://github.com/panyingyun/gostudy/blob/master/exp8.go

转载于:https://my.oschina.net/panyingyun/blog/300007

Go基础知识学习(6) 接口相关推荐

  1. Python基础知识学习笔记——Matplotlib绘图

    Python基础知识学习笔记--Matplotlib绘图 整理python笔记,以防忘记 文章目录 Python基础知识学习笔记--Matplotlib绘图 一.绘图和可视化 1.导入模块 2.一个简 ...

  2. qt checkbox 选中事件_Qt基础知识学习

    Qt基础知识学习 Qt C++ SQLite ★★★★★   Qt · 简介 Qt是由Qt Company开发的面向对象的跨平台C++图形用户界面应用程序开发框架. 前期 · 准备 01 辨析Qt(开 ...

  3. Linux操作系统基础知识学习

    Q1.什么是GNU?Linux与GNU有什么关系? A: 1)GNU是GNU is Not Unix的递归缩写,是自由软件基金会(Free Software Foundation,FSF)的一个项目, ...

  4. 2021-7-19-OpenStack基础知识学习

    OpenStack基础知识学习 参考文献:Wolf_Coder,百度百科 1,云计算 1.1,出现原因 由亚马逊公司提出.1.随着业务增加公司内部的服务器不够使用,进行虚拟化技术->2.随着公司 ...

  5. K8s基础知识学习笔记及部分源码剖析

    K8s基础知识学习笔记及部分源码剖析 在学习b站黑马k8s视频资料的基础上,查阅了配套基础知识笔记和源码剖析,仅作个人学习和回顾使用. 参考资料: 概念 | Kubernetes 四层.七层负载均衡的 ...

  6. uniapp 基础知识学习

    uniapp 基础知识学习 uniapp 基础知识学习 [uniapp 介绍](https://uniapp.dcloud.io/README) 有哪些uni-app的作品 uni-app的社区规模 ...

  7. 网络基础知识学习笔记

    网络基础知识学习笔记 参考菜鸟教程.个人学习整理,仅供参考.三年前学过,三年没用忘了,重新学习整理一下. 文章目录 网络基础知识学习笔记 OSI七层网络模型 IP地址 子网掩码及网络划分 网络协议 A ...

  8. echarts结合react开发基础知识学习

    echarts基础知识学习 1.echarts简介 ECharts,一个使用 JavaScript 实现的开源可视化库,兼容当前绝大部分浏览器(IE8/9/10/11,Chrome,Firefox,S ...

  9. OAM概念及KubeVela基础知识学习

    OAM概念及KubeVela基础知识学习 结合B站KuBeVela开源项目介绍视频以及PPT等学习资料整理,阅读KuBeVela官方文档.仅供个人学习和回顾使用. 参考资料: Introduction ...

最新文章

  1. Java获取当前的系统时间
  2. 无意间看到Pure-Mvc记录下
  3. Bugku 杂项 隐写2 Welcome_.jpg
  4. hbase的集群搭建
  5. 多表操作查询 一对一
  6. 鸿蒙行车记录仪,百度导航新增行车记录仪功能 可消除碰瓷风险
  7. JEECG社区招募新人啦
  8. Hyper-V Server 存储空间
  9. NB-IOT:系列专题1:低功耗能力
  10. 【数学模型】商人们怎样过河?
  11. matlab卷积神经网络的实现,matlab卷积神经网络库
  12. 邮箱不能发送大附件,什么邮箱可以发送超大附件?
  13. 记12306货运系统“抢订空车”插件的编写--订车流程梳理
  14. Win7系统怎么卸载IE浏览器
  15. Win11系统右键没有解压选项!!!???
  16. 抢占式实例在小博无线的应用
  17. 新一届CMO获奖名单公布:人大附中、上海中学霸榜,深圳中学选手夺魁
  18. c#中文件路径出现非法字符怎么办?解决也容易
  19. 批量修改数据进行分批处理
  20. 安装ZoneAlarm防火墙

热门文章

  1. 修改Activity响应音量控制键修改的音频流
  2. 最新 macOS Sierra 10.12.3 安装CocoaPods及使用详解
  3. 一步一步SharePoint 2007之十六:注册并配置一个网站用户
  4. 主动学习综述(ACTIVE LEARNING)
  5. 在VS中用正则表达式查找或替换
  6. tomcat7自身调优和JVM调优
  7. Rhel6-heartbeat配置文档
  8. SQL Server 2000 从哪里看是哪个版本
  9. 人的一生有三件事不能等
  10. Linux03-本地账户和组