GO_08:GO语言基础之interface
接口interface
1. 接口是一个或多个方法签名的集合
2. 只要某个类型拥有该接口的所有方法签名,即算实现该接口,无需显示声明实现了哪个接口,这称为 Structural typing
3. 接口只有方法声明,没有实现,没有数据字段
4. 接口可以匿名嵌入其它接口,或切入到结构中去
5. 将对象赋值给接口时,会发生拷贝,而接口内部存储的是指向这个复制品到指针,既无法修改复制品的状态,也无法获取指针
6. 只有当接口存储的类型和对象都为 nil 时,接口才等于 nil
7. 接口调用不会做 receiver 的自动转换
8. 接口同样支持匿名字段方法
9. 接口也可实现类似 OOP 中的多态
10. 空接口可以作为任何类型数据的容器
那么,让我们先来看一个简单的接口应用案例:
package main import "fmt" /**
定义接口
*/
type USB interface {
Name() string // 定义了名为Name的方法且返回类型为String
Connect() // 定义了名为Connect的方法,没有返回类型形如java中的void
} /**
使用结构体(java中的class) 来实现接口中的方法
具体如何实现是通过为定义的结构体绑定方法来实现,故可以看到下面代码开始先定义一个结构体之后再为这个结构添加方法
*/
type PhoneConnecter struct {
// 定义内部变量
name string
} func (phone PhoneConnecter) Name() string {
return phone.name
} func (phone PhoneConnecter) Connect() {
fmt.Println("Connect:", phone.name)
} func main() {
/*var a USB
a = PhoneConnecter{"PhoneConnecter"}*/
//以上注释代码可以简写为以下形式
a := PhoneConnecter{"PhoneConnecter"}
a.Connect()
//那么有人问来,那你怎么知道 a 是实现来 USB 接口呢?那么我们再定义一个Disconnect函数,参数就传入 USB 类型
Disconnect(a)
/**
从结果可以看出实现接口并没有声明实现哪个接口
*/
} func Disconnect(usb USB) {
fmt.Println("Disconnected.")
}
运行结果:
Connect: PhoneConnecter
Disconnected.
类型断言
1. 通过类型断言的 ok pattern可以判断接口中的数据类型
2. 使用 type switch 则可以针对空接口进行比较全面的类型判断
接口转换
可以将拥有超集的接口转换为子集的接口
更加深入的示例:
package main import (
"fmt"
) /**
定义接口
*/
type USB interface {
Name() string // 定义了名为Name的方法且返回类型为String
Connecter // 接口嵌套,USB 接口也就拥有了 Connecter 接口中 Connect() 方法
} type Connecter interface {
Connect()
} /**
定义结构体
*/
type PhoneConnecter struct {
// 定义内部变量
name string
} /**
真对结构体绑定的方法method
*/
func (phone PhoneConnecter) Name() string {
return phone.name
} func (phone PhoneConnecter) Connect() {
fmt.Println("Connect:", phone.name)
} func main() {
a := PhoneConnecter{"PhoneConnecter"}
a.Connect()
Disconnect(a)
DisconnectAll(a)
DisconnectSwitch(a) // 演示接口类型转换
phone := PhoneConnecter{"PhoneConnecter"} // 声明 PhoneConnecter,其实它是实现来 USB 接口的
var b Connecter // 声明 Connecter 接口
b = Connecter(phone) // 将 USB接口的类型强制转换为 Connecter 类型。即Go语言中接口转换只能从高——>低
b.Connect() // 当前只能调用 Connect 方法并没有 Name 方法了,因为它已经是 Connecter 类型了,不存在 Name 方法
} func Disconnect(usb USB) {
/**
这里是通过类型断言来判定当前是哪个对象调用并打印
类型断言格式:usb.(要判断的对象),判断传入的是否为PhoneConnecter类型
*/
if phone, ok := usb.(PhoneConnecter); ok {
fmt.Println("Disconnected:", phone.name)
return
}
fmt.Println("Unknown decive.")
} /**
Go语言中类型定义只要符合定义的接口那么它就实现来该接口,在java语言中都有一个顶级父类叫 Object。那么在Go语言中有吗?
当然有的,通过接口概念可以了解到当我们定义一个空接口的时候,任何类型都会继承它。那么针对Disconnect方法我们就可以定义一种更加广泛的应用方式
*/
func DisconnectAll(usb interface{}) {
if phone, ok := usb.(PhoneConnecter); ok {
fmt.Println("DisconnectAll:", phone.name)
return
}
fmt.Println("Unknown decive.")
} /**
在Go语言中可以用另外一种方式进行断言,叫:type switch
*/
func DisconnectSwitch(usb interface{}) {
switch v := usb.(type) {
case PhoneConnecter:
fmt.Println("DisconnectSwitch:", v.name)
default:
fmt.Println("Unknown decive.")
}
}
运行结果:
Connect: PhoneConnecter
Disconnected: PhoneConnecter
DisconnectAll: PhoneConnecter
DisconnectSwitch: PhoneConnecter
Connect: PhoneConnecter
GO_08:GO语言基础之interface的更多相关文章
- GO语言基础之interface
接口interface 1. 接口是一个或多个方法签名的集合 2. 只要某个类型拥有该接口的所有方法签名,即算实现该接口,无需显示声明实现了哪个接口,这称为 Structural typing 3. ...
- C#语言基础
第一部分 了解C# C#是微软公司在2000年7月发布的一种全新且简单.安全.面向对象的程序设计语言,是专门为.NET的应用而开发的.体现了当今最新的程序设计技术的功能和精华..NET框架为C#提供了 ...
- 【GoLang】GO语言系列--002.GO语言基础
002.GO语言基础 1 参考资料 1.1 http://www.cnblogs.com/vimsk/archive/2012/11/03/2736179.html 1.2 https://githu ...
- OC语言基础知识
OC语言基础知识 一.面向对象 OC语言是面向对象的,c语言是面向过程的,面向对象和面向过程只是解决问题的两种思考方式,面向过程关注的是解决问题涉及的步骤,面向对象关注的是设计能够实现解决问题所需功能 ...
- Java学习总结(二)----Java语言基础
1. Java语言基础 2.1 关键字 定义:被java语言赋予特殊含义的单词 特点:关键字中的字母都为小写 用于定义数据类型的关键字 class,interface,byte,short,i ...
- JavaScript基础---语言基础(1)
写在前面: 通过四篇博客把JS基础中的基础整理一下,方便自己查阅,这些内容对于实际项目开发中也许并不会在意,但是作为JS的语言基础,自觉还是应该熟悉.在完成这三篇博客(JavaScript基础---语 ...
- Object Pascal 语言基础
Delphi 是以Object Pascal 语言为基础的可视化开发工具,所以要学好Delphi,首先要掌握的就是Object Pascal 语言.Object Pascal语言是Pascal之父在1 ...
- C#语言基础——7月21日
C#语言基础 一.语言基础 (一).函数的四要素: 名称,输入,输出,加工(二).主函数.输出语句.输入语句: Static void Main(string[] args)//下划 ...
- 李洪强iOS开发之OC语言基础知识
OC语言基础知识 一.面向对象 OC语言是面向对象的,c语言是面向过程的,面向对象和面向过程只是解决问题的两种思考方式,面向过程关注的是解决问题涉及的步骤,面向对象关注的是设计能够实现解决问题所需功能 ...
随机推荐
- 团队冲刺——Five
昨天: 司宇航:web项目如何部署到公网,把网址做成桌面图标链接,登录记住密码功能. 王金萱:注册和登录界面,用户数据库的信息录入. 马佳慧:做界面. 季方:处理爬虫数据,实现统计功能. 遇到的问题: ...
- 封装,策略,Asp换脸
封装.策略 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespac ...
- “吃神么,买神么”的第一个Sprint计划(第五天)
“吃神么,买神么”项目Sprint计划 ——5.25 星期一(第五天)立会内容与进度 摘要:logo2出来了,修改过不一样的风格,组内总体评价可以,但是颜色要改,色调没注意,统一决定改成与背景色一致 ...
- OC中的私有方法
1.不写在.h文件中 2.不写在.m文件中 一.私有方法: 没有在.h文件当中进行声明的方法在OC中都被称为私有方法 私有方法子类是无法继承到的
- Week4-作业1:阅读与博客
第四章.两人合作 1.原文: 在变量面前加上有意义的前缀,程序员就能一眼看出变量的类型及相应的语义.这就是“匈牙利命名法”的用处.还有一些地方不适合用“匈牙利命名法”,比如,在一些强类型的语言(如C# ...
- struts2与springmvc的区别
1 机制不同 springmvc的入口是servlet,struts2的入口是filter,导致了二者的机制不同: 2 性能不同 spring会稍微比struts快.spring mvc是基于方法的设 ...
- koa中接收前台传递的各种数据类型的方式
标签(空格分隔): koa 数据类型接收 主要介绍三种会用到的中间件,其实都是自己在开发的过程中踩过的坑 首先介绍koa-body [详情介绍 https://github.com/dlau/koa- ...
- autoit获取ie浏览器简单操作网页(GUI小工具)
需要稍稍熟悉一下autoti提供的语言, 我简单做了一个带GUI的小工具,实现根据IE标题点击页面内的LinkText 注意:使用时IE窗口是显示状态才可以获取到(可以在脚本中加入搜索IE句柄,将ie ...
- VNC Server (CentOS 7 GNOME)
1. 安装VNC服务 sudo yum install tigervnc-server -y 2. 启动VNC服务,设置密码,然后停止 vncserver :1 vncserver -kill :1 ...
- [转帖]脑残式网络编程入门(二):我们在读写Socket时,究竟在读写什么?
脑残式网络编程入门(二):我们在读写Socket时,究竟在读写什么? http://www.52im.net/thread-1732-1-1.html 1.引言 本文接上篇<脑残式网 ...