golang基础教程(十三)、接口、多态_go-courier husky golang,2024年最新2024Golang高级面试题

45 阅读2分钟

golang基础教程

空接口

先看个fmt包中的方法 Println,(经常用来打印输出的)

func Println(a ...interface{}) (n int, err error) {
	return Fprintln(os.Stdout, a...)
}

这里的 interface{} 就是一个空接口,它表示可以接受任意对象;在go中空接口也是一中数据类型(有点类似java中的Object)

func main() {
	var i interface{} = 45
	i=[...]int{1,2,3}
	fmt.Println(i)
}

接口的定义

在接口中可以定义一些通用的方法(不用实现)

type annimal interface {
	eat()
	sleep()
	run()
}

接口的继承与实现

接口的继承与实现也是将被继承和实现的接口以匿名属性传入即可

package main

import "fmt"

type annimal interface {
	eat()
	sleep()
	run()
}

type cat interface {
	annimal
	Climb()
}

type HelloKitty struct {
	cat
}

func (h HelloKitty)eat(){
	fmt.Println("eat cake!!")
}

func main() {
	var a annimal
	a = HelloKitty{}
	a.eat()
}

其中cat 继承了接口annimal ,HelloKitty实现了cat接口;不必将所有的方法都实现(继承和java不同)

多态

有了接口就可以实现多态了

package main

import "fmt"

type annimal interface {
	eat()
	sleep()
	run()
}

type cat interface {
	annimal
	Climb()
}
type dog interface {
	annimal
}

type HelloKitty struct {
	cat
}
type husky struct {
	dog
}

func (h HelloKitty)eat(){
	fmt.Println("eat cake!!")
}

func (h husky)eat(){
	fmt.Println("eat bone!!")
}

func test(a annimal){
	a.eat()
}

func main() {
	var a annimal
	a = HelloKitty{}
	test(a)
	a = husky{}
	test(a)
}

test方法中传入了一个animal对象,在实际调用时会因传入对象的不同而得到不同的效果
结果:

eat cake!!
eat bone!!

类型断言

判断具体的类型,在go中可以使用 对象.(指定的类型) 判断改对象是否时指定的类型

func main() {
	var a annimal
	a = HelloKitty{}
	var b annimal
	b = husky{}

	var animals [2]annimal =[...]annimal{a,b}

	for \_,v :=range animals{
		if data,ok :=v.(husky);ok{
			data.eat()
			fmt.Println("this is wangcai : ")
		}
		if data,ok :=v.(HelloKitty);ok{
			data.eat()
			fmt.Println("this is HelloKitty : ")
		}
	}

}

使用值接收者和使用指针接受者实现接口的区别?

1. 使用值接受者实现接口,结构体类型和结构体指针类型的变量都能存

package main

import "fmt"

type animal interface {
	eat()
}



![img](https://p9-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/d66140c3834540c2b971a5b75f810671~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5py65Zmo5a2m5Lmg5LmL5b-DQUk=:q75.awebp?rk3s=f64ab15b&x-expires=1772462082&x-signature=u%2FK8fNM0Njfgwgj1OD2EYgkdOgQ%3D)
![img](https://p9-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/27e493952e3c4712be122604b4dca509~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5py65Zmo5a2m5Lmg5LmL5b-DQUk=:q75.awebp?rk3s=f64ab15b&x-expires=1772462082&x-signature=M4wPBLe3N75bNH%2FQTrDfPhx5q8A%3D)
![img](https://p9-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/f3c60912e9d34218b1e399b189296276~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5py65Zmo5a2m5Lmg5LmL5b-DQUk=:q75.awebp?rk3s=f64ab15b&x-expires=1772462082&x-signature=fkpdy6IhECuH0dqpnk3RnobzwWQ%3D)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[如果你需要这些资料,可以戳这里获取](https://gitee.com/vip204888)**