一、GoLang 接口的定义
1、GoLang 中的接口
- 在 Go 语言中接口(interface)是一种类型,一种抽象的类型
- 接口(interface)定义了一个对象的行为规范,只定义规范不实现,由具体的对象来实现规范的细节
- 实现接口的条件
- 一个对象只要全部实现了接口中的方法,那么就实现了这个接口
- 换句话说,接口就是一个需要实现的方法列表
2、定义一个 Usber 接口
- 定义了一个 Usber 接口让 Phone 和 Camera 结构体实现这个接口
package mainimport "fmt"//1、接口是一个规范
type Usber interface {start()stop()
}//2.如果接口里面有方法的话,必要通过结构体或通过自定义类型实现这个接口
type Phone struct{Name string
}//3.手机摇实现 usb 接口的话必须先实现 usb 接口中的所有方法
func (p Phone) start() {fmt.PrintIn(p.Name,"启动")
}
func (p Phone) stop() {fmt.PrintfIn(p.Name,"关机")
}func main() {p := Phone{Name : "华为手机"}var p1 Usber //golang中几口就是一个数据类型p1 = pp1.start()p1.stop()
}
/*
华为手机 启动
华为手机 关机*/
二、空接口
1、空接口说明
- golang 中空接口也可以之间当做类型来使用,可以表示任意类型
- Golang 中的接口可以不定义任何方法,没有定义任何方法的接口就是空接口
- 空接口表示没有任何约束,因此任何类型变量都可以实现空接口
- 空接口在实际项目中用的是非常多的,用空接口可以表示任意类型数据
2、空接口作为函数的参数
package mainimport "fmt"//空接口作为函数的参数func show (a interface{}){fmt.Printf("值:%v,类型:%T\n",a,a)
}func main(){show(20) //值:20,类型:intshow("你好 golang") //值:您好 golang 类型:stringslice := []int{1,2,34,5}show(slice) //值:[1 2 34 5] 类型:[]int
}
3、切片实现空接口
package mainimport "fmt"func main() {var slice = []interface{}{"Snail",20,true,32.2}fmt.PrintIn(slice) //[Snail 20 true 32.2]
}
4、map 的值实现空接口
package mainimport "fmt"func main() {//空接口作为 map 值var studentInfo = make(map[string]interface{})studentInfo["name"] = "Snail"studentInfo["age"] = 18studentInfo["married"] = falsefmt.PrintIn(studentInfo)// [age:18 married:false name:Snail]
}
三、类型断言
- 一个接口的值(简称接口值)是由一个具体类型和具体类型的值两部分组成的
- 这两部分分别称为接口的动态类型和动态值
- 如果我们想要判断空接口中值的类型,那么这个时候就可以使用类型断言
- 其语法格式:x.(T)
- x:表示类型为 interface{}的变量
- T:表示断言x 可能是的类型
package mainimport "fmt"func main() {var x interface {}x = "hello golang"v,ok :=x.(string)if ok {fmt.PrintIn(v)}else {fmt.PrintIn("非字符串类型")}
}
四、值接收者和指针接收者
1、值接收者
- 如果结构体中的方法是值接收者,那么实例化后的结构体值类型和结构体指针类型都可以赋值给接口变量
package mainimport "fmt"type Usb interface {Start()Stop()
}
type Phone struct {Name string
}
func (p Phone) Start() {fmt.PrintIn(p.Name,"开始工作")
}
func (p Phone) Stop() {fmt.Println("phone 停止")
}func main() {phone1 := Phone{Name:"华为手机"}var p1 Usb = phone1 //phone1 实现了 Usb接口 phone1 是 Phone 类型p1.Start()phone2 := &Phone{ //华为手机开始工作Name:"苹果手机"}var p2 Usb = phone2 //phone2 实现了 Usb 接口 phone2 是 *Phone 类型p2.Start()
}
2、指针接收者
- 如果结构体中的方法是指针接收者,那么实例化后结构体指针类型都可以赋值给接口变量,结构体值类型没法赋值给接口变量
package main
import "fmt"
type Usb interface {Start()Stop()
}
type Phone struct {Name string
}
func (p *Phone) Start() {fmt.Println(p.Name, "开始工作")
}
func (p *Phone) Stop() {fmt.Println("phone 停止")
}
func main() {/*错误写法phone1 := Phone{Name: "小米手机",}var p1 Usb = phone1p1.Start()*///正确写法phone2 := &Phone{Name: "苹果手机",}var p2 Usb = phone2 //phone2 实现了 Usb 接口 phone2 是 *Phone 类型p2.Start()//苹果手机 开始工作
}
五、一个结构体实现多个接口
package mainimport "fmt"type AInterface interface {GetInfo() string
}
type Binterface interface {SetInfo(string,int)
}
type People struct{Name stringAge int
}func (p People) GetInfo() string(){return fmt.Sprintf("姓名:%v 年龄:%d",p.Name,p.Age)
}func (p *People) SetInfo(name string, age int) {p.Name = namep.Age = age
}func main() {ver people =&People{Name:"Snail",Age: 20,}// people实现了 Ainterface 和 Binterfacevar p1 AInterface = peoplevar p2 Binterface = peoplefmt.PrintIn(p1.GetInfo()) //姓名:Snail 年龄:20p2.SetInfo("pupu",21)fmt.PrintIn(p1.GEtInfo) //姓名:pupu 年龄:21
}
六、接口嵌套
package main import "fmt"type SayInterface interface {say()
}type MoveInterface interface {move()
}//接口嵌套
type Animal interface {SayInterfaceMoveInterface
}
type Cat struct {name string
}
func (c Cat) say() {fmt.PrintIn("喵喵喵")
}
func (c Cat) move(){fmt.PrintIn("猫会动")
}
func main() {var x Animalx = Cat{name: "花花"}x.move() // 猫会动x.say() // 喵喵喵
}