Golang基础_09-接口interface
Posted leafs99
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Golang基础_09-接口interface相关的知识,希望对你有一定的参考价值。
目录
@
接口的定义和基本操作
type USB interface
Name() string
Connect()
type PhoneConnecter struct
name string
func (pc PhoneConnecter) Name() string
return pc.name
func (pc PhoneConnecter) Connect()
fmt.Println("connect:",pc.name)
func main()
a := PhoneConnecter"PhoneConnecter"
a.Connect()
Disconnect(a)
func Disconnect(usb USB)
fmt.Println("Disconnect.")
/*
> Output:
connect: PhoneConnecter
Disconnect.
*/
- 接口是一个或者多个接口声明的集合
- 只要某个类型拥有该接口的所有方法声明,即算实现该接口,无需显示声明实现了哪个接口,这称为structural typing
- 接口只有方法声明,没有实现,没有数据字段
嵌入接口
- 接口可以匿名嵌入其他接口,或嵌入到结构中
type USB interface
Name() string
Connecter
type Connecter interface
Connect()
类型断言
...
...
func Disconnect(usb USB)
//简单的类型断言
if pc,ok := usb.(PhoneConnecter);ok
fmt.Println("Disconnect:",pc.name)
return
fmt.Println("Unknown device.")
/*
> Output:
command-line-arguments
connect: PhoneConnecter
Disconnect: PhoneConnecter
*/
空接口与type switch
- 空接口可以作为任何类型数据的容器
- 任何结构都可以看做是实现了空接口
func Disconnect(usb interface)
type switch
- 通过类型断言的ok pattern可以判断接口中的数据类型
- 使用type switch 则可以针对空接口进行比较全面的类型判断
func Disconnect(usb interface)
//type switch,让系统自己判断类型,然后赋值给type
//一般是参数是空接口的时候用
switch v := usb.(type)
case PhoneConnecter:
fmt.Println("Disconnect:",v.name)
default:
fmt.Println("Unknown device.")
接口转换
- 可以将拥有超集的接口转换为子集的接口
type USB interface
Name() string
Connecter
type Connecter interface
Connect()
type PhoneConnecter struct
name string
func (pc PhoneConnecter) Name() string
return pc.name
func (pc PhoneConnecter) Connect()
fmt.Println("connect:",pc.name)
func main()
pc := PhoneConnecter"PhoneConnecter"
var a Connecter
a = Connecter(pc)
a.Connect()
/*
> Output:
command-line-arguments
connect: PhoneConnecter
*/
- 接口转换的时候只能降级转换
接口使用注意事项
- 将对象赋值给接口时,会发生拷贝,而接口内部存储的是指向这个复制品的指针,修改对象既无法修改复制品的状态,也无法获取指针
- 只有当接口存储的类型和对象都为nil时,接口才等于nil
func main()
var a interface
fmt.Println(a==nil)
var p *int =nil
a=p
fmt.Println(a==nil)
/*
true
false
*/
//第一个是nil
//第二个是存的指向为空的指针,就不是nil了
- 接口调用不会做receiver的自动转换
- 接口 同样支持匿名字段方法
- 接口同样也可实现类似OOP中的多态
以上是关于Golang基础_09-接口interface的主要内容,如果未能解决你的问题,请参考以下文章