0Pricing
Go Academy · 课时

嵌入接口

组合接口

嵌入接口 是 CoddyKit 上的免费 Go Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Go Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Go Academy 课程共包含 4 节课。

组合接口

接口可以嵌入其他接口,将它们的方法集合并为更大的契约。标准库中处处使用这种方式。

嵌入语法

在另一个接口中列出接口类型,即可包含其全部方法。

package main

import "fmt"

type Reader interface{ Read() string }
type Writer interface{ Write(s string) }
type ReadWriter interface {
	Reader
	Writer
}

func main() {
	var rw ReadWriter
	fmt.Println(rw == nil)
}

实际应用中的 io.ReadWriter

经典示例是 io.ReadWriter,它通过嵌入 io.Reader 和 io.Writer 定义。任何同时具有这两个方法的类型都满足该接口。

满足组合接口

具体类型只需具备所有必需的方法,就能实现组合接口。

package main

import "fmt"

type Reader interface{ Read() string }
type Writer interface{ Write(s string) }
type ReadWriter interface {
	Reader
	Writer
}

type File struct{ data string }

func (f *File) Read() string  { return f.data }
func (f *File) Write(s string) { f.data = s }

func main() {
	var rw ReadWriter = &File{}
	rw.Write("hi")
	fmt.Println(rw.Read())
}

为什么要组合接口

小型接口易于实现和测试。只在需要的地方组合它们,可以构建更大的契约,同时让每个部分保持最小化。

从小部件构建

定义专注于单一方法的接口,然后将它们组合起来。

package main

import "fmt"

type Opener interface{ Open() }
type Closer interface{ Close() }
type OpenCloser interface {
	Opener
	Closer
}

type Door struct{}

func (Door) Open()  { fmt.Println("opened") }
func (Door) Close() { fmt.Println("closed") }

func main() {
	var oc OpenCloser = Door{}
	oc.Open()
	oc.Close()
}

没有重复方法

嵌入的接口不得贡献签名冲突的重复方法;在现代 Go 中,相同的方法集没有问题。

接收最小接口

函数应当只要求其所需的最小接口。如果只需读取,就接收 io.Reader,而不是 io.ReadWriteCloser。

package main

import "fmt"

type Reader interface{ Read() string }

func dump(r Reader) { fmt.Println(r.Read()) }

type Buf struct{}

func (Buf) Read() string { return "data" }

func main() {
	dump(Buf{})
}

io 接口家族

标准库将 Reader、Writer、Closer 组合成 ReadCloser、WriteCloser、ReadWriteCloser——形成清晰的契约层次。

API 中的组合接口

返回值支持的最宽接口,但接收函数实际使用的最窄接口。这样可以同时最大化灵活性和清晰度。

接口嵌入与结构体嵌入

  • 结构体嵌入会提升字段和方法,以复用行为
  • 接口嵌入会将方法要求组合成更大的契约

快速检查

请测试您对接口嵌入的了解。

回顾

您学习了接口嵌入。

  • 在另一个接口中列出接口,以合并方法集
  • io 包会组合读取器、写入器和关闭器
  • 保持基础接口小巧,仅在需要时进行组合
  • 接收函数所需的最小接口

常见问题解答

「嵌入接口」课时是免费的吗?

是的 — 「嵌入接口」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Go Academy 课程的其余内容,请升级到 CoddyKit PRO。 Go Academy 课程共包含 4 节课。

「嵌入接口」这节课中我会学到什么?

组合接口 你通过在浏览器中直接运行的动手代码来练习 Go Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Go Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Go Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。

「嵌入接口」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Go Academy 课中编写并运行代码吗?

能。每节 Go Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 嵌入结构体
  2. 嵌入接口
  3. 方法提升
  4. 组合优于继承
← 返回 Go Academy