上次在最后提了一句接口嵌套,空接口等等,这次就做个补完。
本人刚学习Go语言不久,想把自己对接口的一些理解写出来,如果有错误或者更好的理解方法,请大佬指正。
一、多类型/接口
接口与类型存在一对多的关系
1.1 多类型与单一接口
顾名思义,一个接口可以实现多个类型,这里用使命召唤cod来举个例子:
//定义一个索尼的平台
type sony struct {
console string
}
//定义一个微软的平台
type microsoft struct {
console string
}
//定义一个游戏的接口
type game interface {
cod()
}
//PS平台的cod
func (p sony) cod() {
fmt.Printf("我是%s的西欧帝\n", p.console)
}
//xbox平台的cod
func (x microsoft) cod() {
fmt.Printf("我是%s的西欧帝,我被收购了\n", x.console)
}
这里我定义了索尼和微软两个结构体平台来存放他们的主机,定义了一个游戏接口,里面有个cod的方法。
而下面有两个方法,一个是索尼实现cod的接口,一个是微软实现cod的接口。
从而实现无论是ps5还是Xbox Series X,它都能玩cod,只是cod的平台不一样罢了:
func main() {
//声明接口,cod是个FPS游戏
var FPS game
//实例化索尼的ps5
PS5 := sony{
console: "ps5",
}
//实例化微软的xbox
XBOX := microsoft{
console: "Xbox Series X",
}
//调用方法
FPS = XBOX
FPS.cod()
FPS = PS5
FPS.cod()
}
1.2 单一类型与多个接口
与上面类似,直接举例子:
//定义一个FPS游戏接口
type FPS interface {
fps()
}
//定义一个RPG游戏接口
type RPG interface {
rpg()
}
//定义一个微软的结构体
type Microsoft struct {
console string
}
//定义一个fps的方法,xbox现可游玩cod
func (m Microsoft) fps() {
fmt.Printf("cod available now on %s\n", m.console)
}
//定义一个rpg的方法,xbox现可游玩破晓传说
func (m Microsoft) rpg() {
fmt.Printf("Tales of Arise available now on %s\n", m.console)
}
func main() {
//声明FPS接口
var fps FPS
//声明RPG接口
var rpg RPG
//实例化Xbox主机
xbox := Microsoft{
console: "xbox",
}
//调用
fps = xbox
rpg = xbox
fps.fps()
rpg.rpg()
}
上述实现了微软xbox这个结构体实现了两个接口,rpg和fps,xbox既能玩cod,也能玩破晓传说。
通过1.2可以引出下一个部份,接口嵌套。
1.3 接口嵌套
顾名思义,就是一个接口嵌套另外一个或多个接口创造出新的接口,把上述的代码修改一下:
type allGames interface {
FPS
RPG
}
type FPS interface {
fps()
}
type RPG interface {
rpg()
}
type Microsoft struct {
console string
}
func (m Microsoft) fps() {
fmt.Printf("cod available now on %s\n", m.console)
}
func (m Microsoft) rpg() {
fmt.Printf("Tales of Arise available now on %s\n", m.console)
}
func main() {
var games allGames
xbox := Microsoft{
console: "xbox",
}
games = xbox
games = xbox
games.fps()
games.rpg()
}
另外定义一个allGames的接口,把RPG和FPS接口嵌套。
最后仅声明allGames也能调用FPS和RPG
二、空接口
空接口与之前的接口不太一样,有点特殊。空接口是一个未定义方法的接口。
任何类型或变量都可以实现空接口,空接口可以为任意类型。举个例子:
var x interface{}
func main() {
s := "hello world"
x = s
fmt.Println(x)
}
这里定义了一个空接口,在main中我将字符串s赋值给x空接口,此时的x就是字符串类型。空函数可以作为函数的参数,也可以作为map的值,像python定义一个字典一样使用。在此就不举例子了。
总结:
突然有了点想法的随笔,以上仅是我一点点浅显的理解,要是露怯了请指正!
这是个夹带了很多私货的笔记。