栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Go语言

Golang——接口、多态、接口继承与转换、空接口、类型断言

Go语言 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Golang——接口、多态、接口继承与转换、空接口、类型断言

  • 接口是一种规范与标准,只是规定了要做哪些事情。但是具体怎么做,是实现接口的类去做的,接口只是把所有具有共性的方法定义在一起。
  • 接口存在的意义就是用来定义规范,用来做功能的拓展
  • 接口最大的好处是可以实现多态
  • 在Golang中只要接口中的方法和结构体重的一样,就会认为这么结构体实现了这个接口的方法
  • 在这里还是要吐槽一下,Go的语法是真的丑,如果你是Java转过来的,就会发现,垃圾的一批
接口定义及调用:

定义格式:

tepe 接口名 interface{
	方法 返回值类型
}

调用格式1:

对象名.方法名

调用格式2:这种方式必须实现接口中声明的所有方法

通过接口变量调用

演示:

func main() {

	// 对象名.方法名
	var stu Student
	stu.Hello() // Student类实现了接口的Hello方法
	var tea Teacher
	tea.Hello() // Teacher类实现了接口的Hello方法

	// 通过接口变量调用,如果接口中有两个方法,但是只实现了一个,就会报错,必须全部实现
	var testInterface TestInterface
	testInterface = &stu
	testInterface.Hello() // Student类实现了接口的Hello方法

	testInterface = &tea
	testInterface.Hello() // Teacher类实现了接口的Hello方法
}

type Student struct{}

type Teacher struct{}

type TestInterface interface {
	Hello()
}

func (student *Student) Hello() {
	fmt.Println("Student类实现了接口的Hello方法")
}

func (teacher *Teacher) Hello() {
	fmt.Println("Teacher类实现了接口的Hello方法")
}
多态:
  • 多态是指同一行为,具有多个不同表现形式
  • 多态是一同一个接口,使用不同的实例执行不同的操作
  • 多态是除封装、继承之后面向对象的第三大特征。
  • 多态是出现在接口关系中的(只能是接口)
  • 举例:win电脑和Mac都是电脑(接口),但是mac只能办公用,win可以办公可以玩游戏,不同类型的电脑具有不同的特征,就是多态

多态的实现:

func 函数名 (参数 接口类型){}

演示:

func main() {
	var stu Student
	var tea Teacher

	// 多态
	Polymorphic(&stu) //Student类实现了接口的Hello方法
	Polymorphic(&tea) // Teacher类实现了接口的Hello方法
}

type Student struct{}

type Teacher struct{}

type TestInterface interface {
	Hello()
}

func (student *Student) Hello() {
	fmt.Println("Student类实现了接口的Hello方法")
}

func (teacher *Teacher) Hello() {
	fmt.Println("Teacher类实现了接口的Hello方法")
}

func Polymorphic(polymorphic TestInterface) {
	polymorphic.Hello()
}
接口的继承与转换:

接口的继承和普通继承是一样的,直接写接口名就可以了

演示:

func main() {
	var stu Student
	var test02 TestInterface02
	test02 = &stu
	test02.Hello()
	test02.HelloHello() // 可以调用所继承接口中的方法

	var test TestInterface
	test = test02
	test.Hello()
}

type Student struct{}

type Teacher struct{}

type TestInterface interface {
	Hello()
}

type TestInterface02 interface {
	TestInterface // 继承第一个接口
	HelloHello()
}

func (student *Student) Hello() {
	fmt.Println("Hello")
}

func (student *Student) HelloHello() {
	fmt.Println("HelloHello")
}
空接口定义及使用:

空接口(interface {})不包含任何的方法,正因为如此,所有的类型都实现了空接口,因此空接口可以存储任意类型的数值

演示:

func main() {
	// 定义空接口的切片,由于是空接口所以可以存储任意类型的数据
	var s []interface{}
	s = append(s, 1, 2, 3, "字符串", 1.1, true)
	fmt.Println(s)
}
类型断言:

通过类型断言,可以判断空接口中存储的数据类型

定义格式:

value,ok:=m.(T)
  • value:表示变量m的值
  • ok:表示布尔类型变量,如果断言成功为true,否则为false
  • m:表示空接口类型的变量
  • T:表示断言的类型
  • 如果m

演示:

func main() {
	var i interface{}
	i = 123
	
	// 如果i是int类型就会把结果赋值给ok,把数据(123)赋值给value
	value, ok := i.(int)
	// 如果是123就会打印断言成功,不是123就会打印断言失败
	if ok {
		fmt.Println("断言成功:", value)
	} else {
		fmt.Println("断言失败")
	}
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/944216.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号