本文详解 go 语言中如何通过结构体嵌入(embedding)而非字段组合来正确实现接口委托,重点解决因误用字段封装导致的 `io.writer`/`io.reader` 接口未满足问题,并提供可运行的完整示例。
在 Go 中,“嵌入(embedding)” 是一种语法糖,其核心语义是:将被嵌入类型的方法集提升为外层结构体的方法集——但前提是该类型必须以匿名字段(即无字段名)形式声明。而原代码中 MyWriter 和 MyReader 内部将 io.Writer 和 io.Reader 作为具名字段(w io.Writer、r io.Reader),这属于组合(composition),并非嵌入,因此其 Write/Read 方法不会自动暴露给外层结构体。
要使 MyReadWriteCloser 满足 io.Writer 和 io.Reader,需分两步修正:
- 让 MyWriter 和 MyReader 直接嵌入标准接口(而非包装为字段);
- 确保方法委托正确返回结果(原代码中忽略了 Write/Read 的返回值,会导致调用方无法感知写入长度或错误)。
以下是修复后的完整可运行代码: