欢迎访问 如意编程网!

如意编程网

当前位置: 首页 > 编程资源 > 综合教程 >内容正文

综合教程

go面向对象之多态即接口(interface)

发布时间:2023/10/11 综合教程 23 老码农
如意编程网 收集整理的这篇文章主要介绍了 go面向对象之多态即接口(interface) 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

Go 语言接口

Go 语言提供了另外一种数据类型即接口,它把所有的具有共性的方法定义在一起,任何其他类型只要实现了这些方法就是实现了这个接口。

实例

/* 定义接口 */
type interface_name interface {
method_name1 [return_type]
method_name2 [return_type]
method_name3 [return_type]
...
method_namen [return_type]
} /* 定义结构体 */
type struct_name struct {
/* variables */
} /* 实现接口方法 */
func (struct_name_variable struct_name) method_name1() [return_type] {
/* 方法实现 */
}
...
func (struct_name_variable struct_name) method_namen() [return_type] {
/* 方法实现*/
}

a、定义多个结构体

b、为每个结构体定义一个相同的方法,比如我们下面的事例,Say

c、定义一个接口,这个接口的内容就是步骤b定义的Say()方法

d、在定义一个函数,这个函数,这个函数的参数类型就是步骤c定义的接口

e、调用步骤d的函数,传递一个步骤b定义的结构体进去 就实现了多态

1、go语言的多态是用接口来实现的interface

package main

import "fmt"

//面向对象的多态是通过接口interface来实现的,不同的对象,调用相同的接口,实现不同的效果

//go语言中,接口interface是一个自定义类型,描述了一系列方法的集合,关键字interface
//接口不能被实例化 //定义接口的方法
//type 接口名字 interface {
//
//} //接口的名字一般以er结尾 //定义一个Personer的接口
type Personer interface {
Say()
} //定义一个学生的结构体 type Studentxxx struct {
name string
score int
} type Teacherxxx struct {
name string
class string
} func (s *Studentxxx) Say () {
fmt.Println(s.name,s.score)
} func (s *Teacherxxx) Say () {
fmt.Println(s.name,s.class)
} type Mystring string func (m Mystring) Say () {
fmt.Println("自定义标准类型")
} //go语言的多态来实现
func Whosay(i Personer) {
i.Say()
} func main() {
sxxxx := &Studentxxx{name:"张三",score:12}
txxxx := &Teacherxxx{name:"李四",class:"一年级"} var my Mystring = "ABC" sxxxx.Say()
txxxx.Say()
my.Say()
//张三 12
//李四 一年级
//自定义标准类型 //go语言实现多态
Whosay(sxxxx)
Whosay(txxxx)
Whosay(my) //张三 12
//李四 一年级
//自定义标准类型 //练习一下make,创建一个数组
x := make([]Personer,3) x[0],x[1],x[2] = sxxxx,txxxx,my
for _,value := range x {
value.Say()
}
//张三 12
//李四 一年级
//自定义标准类型
}

  

2、interface接口实现继承

//定义一个Personer的接口
type Personer interface {
Say()
} //接口也可以继承,我们这里写了一个Personer1的接口,这个接口继承Personer这个接口,也就是说Personer1
//这个接口也有Say这个方法了,我们同样也为Personer1这个接口定义了自己的方法,Run()
type Personer1 interface {
Personer
Run()
}

  

定义了结构体

type Personxxxx struct {
name string
class string
age int
}

  

定义一个函数

//go语言的多态来实现
func Whosay(i Personer) {
i.Say()
}

  

为继承的接口定义方法

func (s2 *Personxxxx) Say()  {
fmt.Println("接口的继承测试1")
} func (s2 *Personxxxx) Run() {
fmt.Println("接口的继承测试2")
}

  

	p2 := &Personxxxx{name:"p2222",class:"二年级",age:12}

	p2.Say()
p2.Run()
//接口的继承测试1
//接口的继承测试2 Whosay(p2)
//接口的继承测试1

  

3、if格式的类型判断

package main

import (
"fmt"
) //接口类型判断 //定义一个空接口
type Niler interface {
} type PersonTest struct {
name string
age int } func main() {
//定义一个接口类型的切片
list := make([] Niler,3)
list[0] = 1
list[1] = "hello"
list[2] = PersonTest{name:"erBi",age:12} for k,v := range list {
//类型断言,返回的两个参数,一个是value,一个是ok,value是变量的值,ok是返回的布尔值
//comma-ok断言
//这里的例子就是通过上面的返回值v来判断v的类型,如果v的类型为int。则ok为true
_,ok := v.(int)
if ok {
fmt.Println(k,v,"数字")
} else if _,ok := v.(string);ok{
fmt.Println(k,v,"字符串")
} else if value,ok := v.(PersonTest);ok {
fmt.Println(value.name,"结构体")
} else {
fmt.Println("错误的数据类型")
}
}
//0 1 数字
//1 hello 字符串
//erBi 结构体
}

  

4、switch的类型判断

总结

以上是如意编程网为你收集整理的go面向对象之多态即接口(interface)的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得如意编程网网站内容还不错,欢迎将如意编程网推荐给好友。