接口是什么
在Go语言中接口(interface)
是一种抽象的类型
接口(interface)
定义了一个对象的行为规范,只定义规范不实现
,有具体的对象来实现规范的细节
实现接口的条件:一个对象实现了接口中的所有方法
定义一个接口
// 定义接口
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() {
// 对多个设备操作
devices := []Usber{
Computer{Name: "拯救者"},
Phone{Name: "iphone 15 promax"},
}
for _, devices := range devices {
devices.start()
}
// 单独对某个设备操作
//com := Computer{Name: "拯救者R9000P"}
//com.start()
}
type Computer struct {
Name string
}
func (c Computer) start() {
fmt.Println(c.Name, "开机")
}
func (c Computer) stop() {
fmt.Println(c.Name, "关机")
}
>>> 输出
拯救者 开机
iphone 15 promax 启动
空接口
golang中空接口也可以直接当做类型来使用,可以表示任意类型 (泛型概念)
Golang 中的接口可以不定义任何方法,没有定义任何方法的接口就是空接口
空接口作为函数的参数
func show(a interface{}) {
fmt.Printf("值:%v 类型:%T\n", a, a)
}
func main() {
show(20)
show("Hello world")
slice := []int{1, 2, 3, 4}
show(slice)
}
>>> 输出
值:20 类型:int
值:Hello world 类型:string
值:[1 2 3 4] 类型:[]int
切片实现空接口
func main() {
var slice = []interface{}{"张三", 20, true}
fmt.Println(slice)
}
>>> 输出
[张三 20 true]
map的值实现空接口
func main() {
var studenInfo = make(map[string]interface{})
studenInfo["name"] = "张三"
studenInfo["age"] = 18
studenInfo["married"] = false
fmt.Println(studenInfo)
}
>>> 输出
map[age:18 married:false name:张三]
类型断言
func main() {
var x interface{}
x = "a"
v, ok := x.(string)
fmt.Printf("值为%v,类型状态:%t", v, ok)
}
>>> 输出
值为a,类型状态:true
值接收者和指针接收者
指针类型接收
者的使用场景:并不是所有情况下都希望修改数据
1、需要修改接收者的值
2、接收者是拷贝代价比较大的大对象
3、保证一致性,如果有某个方法使用了指针接收者,那么其他的方法也应该使用指针接收者
type Usb interface {
Start()
Stop()
}
type Phone struct {
Name string
}
func (p Phone) Start() {
fmt.Println(p.Name, "start working...")
}
func (p Phone) Stop() {
fmt.Println(p.Name, "stop working...")
}
func main() {
xiaomi := Phone{Name: "小米手机"} // 实例化值类型
var p1 Usb = xiaomi
p1.Start()
huawei := &Phone{Name: "华为手机"} // 实例化指针类型
var p2 Usb = huawei
p2.Start()
var p3 Usb = huawei // 实现usb接口是*phone类型
p3.Start()
}
>>> 输出
小米手机 start working...
华为手机 start working...
华为手机 start working...