1.接口介绍
1.现实生活中电子产物都离不开usb接口建立连接。我们不需要关注usb卡槽是否一样,因为所有的usb接口都是按照统一标准来设计的。
2.Go语言中的接口是一种抽象数据类型,go语言中接口定义了对象的行为规范,只定义规范不实现。接口定义的规范由具体的对象来实现。
接口就是一个标准,它是对一个对象的行为和规范进行约定,约定实现接口的对象必须得按照接口的规范。
2.接口定义
在Golang中接口interface 是一种类型,一种抽象的类型。接口是一组函数method的集合,Golang中的接口不能包含任何变量。
在Golang中接口的所有方法都没有方法体,接口定义了一个对象的行为规范,只定义接口规范不实现。接口体现了程序设计的多态和高内聚低耦合的思想。
Golang中的接口也是一种数据类型,不需要显示实现。只需要一个变量含有接口类型中的所有方法,那么这个变量就实现了这个接口。
type 接口名 interface{
方法名1 ( 参数列表1) 返回值列表1
方法名2 ( 参数列表2) 返回值列表2
}
接口名:在type将接口定义为自定义的类型名。Go语言的接口在命名时候,一般会在单词后面加er
方法名:在方法名首字母是大写且这个接口类型名首字母也是大写时,这个方法可以被接口所在的包之外的代码访问
参数列表、返回之列表:可以忽略参数名
***注意:如果接口里面有方法的话,必须要通过结构体或者通过自定义类型实现这个接口
接口是一个规范,必须按照接口来。如果定义了一个结构体,必须这个结构体要实现所有接口中的方法
package main
import "fmt"
type Usber interface {
start()
stop()
}
type Phone struct{
name string
}
func (p Phone) start() {
fmt.Println(p.name,"启动")
}
func (p Phone) stop() {
fmt.Println(p.name,"关机")
}
func main() {
p := Phone{
name : "华为",
}
var c Usber = p //表示让Phton实现Usb接口
c.start()
c.stop()
}
3.空接口
golang中的接口可以不定义任何方法,没有定义任何方法的接口就是空接口。
空接口表示没有任何约束,因此任何类型变量都可以实现空接口。用于表示任意数据类型。
golang中口接口可以直接当类型使用,可以表示任意类型
//第一种方法
func main(){
var a string = "123"
fmt.Printf("%v,%T",a,a)
}
//第二种方法
type ser interface {}
func main() {
var a string = "123"
var s ser
s = a
fmt.Printf("%v,%T",s,s)
var b bool = true
s = b
fmt.Printf("%v,%T",s,s)
}
//第三种方法 map的值实现空接口
var studentinfo = make(map[string]interface{})
studentinfo["name"] = "张三"
studentinfo["age"] = 18
studentinfo["married"] = false
//第四种方法 切片
var s1 = []interface{}{1,2,"hello",true}
4.类型断言
一个接口的之(简称接口值)是由一个具体类型和具体类型的值两部分组成的。这两部分分别成为接口的动态类型和动态值。
如果我们想要判断空接口中值的类型,那么可以使用类型断言
x.(T)
x:表示类型为interface{}的变量
T:表示断言x可能是的类型。
该语法返回两侧参数,第一个参数是x转化为T类型后的变量,第二个是一个布尔值
var a interface{}
a = "你好golang"
v, ok = a.(string)
if ok {
fmt.Println("是一个string类型")
}else {
fmr.Println("断言失败")
}
//也可以判断是否是结构体
x.(Phone)
Phone 是一个结构体
5.结构体值接收者和指针接收者实现接口的区别
值接收者: 如果结构体中的方法是值接收者,那么实例化后的结构体值类型和结构体指针类型都可以赋值给接口变量
package main
import "fmt"
type Usber interface {
start()
stop()
}
type Phone struct{
name string
}
func (p Phone) start() { //值接收者
fmt.Println(p.name,"启动")
}
func (p Phone) stop() { // 值接收者
fmt.Println(p.name,"关机")
}
func main() {
p := Phone{
name : "华为",
}
var c Usber = p //表示让Phton实现Usb接口
c.start()
c.stop()
}
//指针接收者
package main
import "fmt"
type Usber interface {
start()
stop()
}
type Phone struct{
name string
}
func (p *Phone) start() { //指针接收者
fmt.Println(p.name,"启动")
}
func (p *Phone) stop() {
fmt.Println(p.name,"关机")
}
func main() {
p := &Phone{
name : "华为",
}
var c Usber = p //表示让Phton实现Usb接口
c.start()
c.stop()
}
6.接口嵌套
type A inerface {
getname()
}
type B inerface {
setname(string)
}
type C interface{
A
B
}