接口基础知识分享
一、接口的定义
type 接口名 interface {
方法名1(参数列表)返回值列表
方法名2(参数列表)返回值列表
}
二、接口的形象例子
现实生活中Usb接口就是一个形象的接口例子,例如手机、相机、U盘这些按照统一规格设计Usb在插头,插入Usb接口后有不同的反应
package main
import (
"fmt"
)
type Usb interface{
start() //开始工作
stop() //结束工作
}
type Computer struct{
} //定义电脑U盘插口
type phone struct{
Name string
}
type U struct{
Name string
} //定义手机以及U盘对象
func (this *phone) start(){
fmt.Println("我是手机")
}
func (this *phone) stop(){
fmt.Println("再见")
}
//手机已经实现了接口
func (this *U) start(){
fmt.Println("我是U盘")
}
func (this *U) stop(){
fmt.Println("再见")
}
//U盘已经实现了接口
func (this *Computer) Working(usb Usb){
usb.start()
usb.stop()
}
func main(){
com:=&Computer{
}
u:=&U{
}
p:=&phone{
}
com.Working(u) //模拟U盘插入
com.Working(p) //模拟手机插入
}
三、接口与继承的区别
继承解决的是代码复用性,接口是增加功能,并且不破坏继承性
四、注意事项
1、接口的方法都没有方法体;是引用类型;
2、如果一个类型将接口的所有方法都实现,就说明这个类型实现了这个接口;
3)接口中不能拥有任何变量;
4)一个接口可以继承多个接口,实现该接口必须实现所有接口的方法;
5)空接口没有任何方法,任何类型都实现了空接口,任何变量都可以赋值给空接口;
五、接口体现多态
1、多态数组
var usb [2] Usb
usb[0]= Phone {
"小米手机"}
usb[1]= U {
"金士顿U盘"}
fmt.Println(usb)
在这里出现了一个小bug,在传递时候,结构体是值类型,但如果需要修改结构体的值,需要使用指针类型进行引用传递。
2、类型断言
1、由于接口是一般类型,不知道是什么类型,所以必须要使用类型断言
var b interface{
}
a:=b.(float32)
2、使用类型断言获取type
func Juge(item...interface{
}){
for i,v:=range item{
switch v.(type){
case string:{
fmt.Printf("第%d参数的类型string 值是%v\n",i,v)
}
case int:{
fmt.Printf("第%d参数的类型是int 值%v\n",i,v)
}
case student:{
fmt.Printf("第%d参数的类型是student 值是%v\n",i,v)
}
case *student:{
fmt.Printf("第%d参数的类型是*student 值是%v\n",i,v)
}
}
}
}
在代码中item...interface{}
表示多参数传导
如果大家看完这篇文章对自己有帮助,希望大家点赞支持一下,谢谢