Go语言面向对象

接口是什么

在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...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值