Go语言学习 二十一 内嵌

本文介绍了Go语言中的内嵌特性,包括接口内嵌和结构内嵌。接口内嵌允许将现有接口嵌入新接口中,而结构内嵌则通过组合其他类型实现功能复用。文章详细讲解了内嵌字段、晋升、命名冲突处理、方法继承性以及选择器的使用规则。内嵌是Go语言中实现功能组合和避免继承带来的复杂性的一种重要方式。
摘要由CSDN通过智能技术生成

本文最初发表在我的个人博客,查看原文,获得更好的阅读体验


在像Java这种语言中,有子类(或者继承)的概念,通过继承复用已有的功能或属性,与继承不同,Go中使用组合的方式来完成已有实现的复用,这种做法称为内嵌。具体来说,就是将已定义类型内嵌到结构体或接口中完成组合。

一 接口内嵌

接口内嵌非常简单。例如标准库中的io.Readerio.Writer接口,它们的定义如下:

type Reader interface {
   
	Read(p []byte) (n int, err error)
}

type Writer interface {
   
	Write(p []byte) (n int, err error)
}

我们当然可以声明一个新的接口来显示的包含上述的ReadWrite方法:

type ReadWriter interface {
   
    Read(p []byte) (n int, err error)
    Write(p []byte) (n int, err error)
}

但是,更好的做法是将已有的接口内嵌到新的接口中,就像标准库io.ReadWriter所做的这样:

// ReadWriter 接口整合了 Reader 和 Writer 接口。
type ReadWriter interface {
   
    Reader
    Writer
}

现在,ReadWriter同时拥有了ReaderWriter的功能。

需要注意的是,内嵌的接口中不能包含重复的方法,而且接口中只能嵌套接口
例如以下错误示例

package main

import "fmt"

func main() {
   
	fmt.Println("test")
}

type A interface {
   
	M1()
	M2()
}

type B interface {
   
	M2()
	M3(<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值