Go语言接口interface学习笔记.续

        上次在最后提了一句接口嵌套,空接口等等,这次就做个补完。

        本人刚学习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这个结构体实现了两个接口,rpgfpsxbox既能玩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的接口,把RPGFPS接口嵌套。

        最后仅声明allGames也能调用FPSRPG

二、空接口

        空接口与之前的接口不太一样,有点特殊。空接口是一个未定义方法的接口。

        任何类型或变量都可以实现空接口,空接口可以为任意类型。举个例子:

var x interface{}

func main() {
	s := "hello world"
	x = s
	fmt.Println(x)
}

        这里定义了一个空接口,在main中我将字符串s赋值给x空接口,此时的x就是字符串类型。空函数可以作为函数的参数,也可以作为map的值,像python定义一个字典一样使用。在此就不举例子了。

总结:

        突然有了点想法的随笔,以上仅是我一点点浅显的理解,要是露怯了请指正!

        这是个夹带了很多私货的笔记。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值