[GO]类型与接口的关系&&接口的嵌套

本文探讨了如何在一个类型中实现多个接口,以及不同类型组合实现相同接口的情况。通过实例展示了如何通过结构体组合实现服务接口,强调了接口嵌套对类型实现复杂功能的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

GO类型与接口的关系

一个类型实现多个接口

比如一个io类型的struct需要同时具备读和写的功能,因此需要实现多个接口(读和写接口)

// +build ignore

package main
// 一个类型实现多个接口
import (
	"fmt"
)

type mywriter interface {
	write()
}

type myreader interface {
	read()
}

type socket struct {}

func (d *socket) write()  {
	fmt.Println("write...")
}

func (d *socket) read()  {
	fmt.Println("read...")
}

func main() {
	s := new(socket)
	s.write()
	s.read()
}
多个类型实现同一个接口

多个类型同一个接口,但是这些类型需要是组合关系

// +build ignore

package main
// 多个类型可以实现相同的接口
import (
	"fmt"
)

type Service interface {
	Start() // 启动服务
	Log(string) // 输出日志
}

type Logger struct{}

type GameService struct{
	Logger // 组合Logger
}

// Logger实现Service接口中的Log(string)
func (l *Logger) Log(s string)  {
	fmt.Println(s)
}

// GameService实现Service接口中的Start()
func (g *GameService) Start()  {
	fmt.Println("Start...")
}

func main() {
	var service Service
	service = new(GameService)
	service.Start()
	service.Log("GameService间接实现了Log方法")
	// service = new(Logger) // cannot use new(Logger) (value of type *Logger) as Service value in assignment: missing method StartcompilerInvalidIfaceAssign Logger没有实现Service接口的所有方法,导致编译错误
}

小结:

type A struct {}
type B struct {
    A 
}

这里B是大类型,A是小类型:只需要A、B两个类型合力完整地实现了某个接口i1,那么对于大类型B,就是实现了i1;但是对于小类型A来说,它并没有实现接口i1。
但如果实现接口i1的工作都由小类型A来做(A实现了接口i1的所有方法,B没有实现接口i1的任何方法),那么小类型A和大类型B都实现了接口i1.

接口的嵌套组合
type A interface{}
type B interface{}
type C interface{
	A
	B
}

一个类型S实现了A和B,那么S也实现了C;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值