From 1ed98619654bffb4ec44404c7d0656ac27a6fd46 Mon Sep 17 00:00:00 2001 From: L1nSn0w Date: Wed, 3 Sep 2025 09:10:55 +0800 Subject: [PATCH] Document conditions for implementing interfaces Add section on interface implementation conditions --- ch7/ch7-03.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ch7/ch7-03.md b/ch7/ch7-03.md index 9b3d1bd..65913d0 100644 --- a/ch7/ch7-03.md +++ b/ch7/ch7-03.md @@ -79,7 +79,7 @@ any = new(bytes.Buffer) 对于创建的一个interface{}值持有一个boolean,float,string,map,pointer,或者任意其它的类型;我们当然不能直接对它持有的值做操作,因为interface{}没有任何方法。我们会在7.10章中学到一种用类型断言来获取interface{}中值的方法。 -因为接口与实现只依赖于判断两个类型的方法,所以没有必要定义一个具体类型和它实现的接口之间的关系。也就是说,有意地在文档里说明或者程序上断言这种关系偶尔是有用的,但程序上不强制这么做。下面的定义在编译期断言一个`*bytes.Buffer`的值实现了io.Writer接口类型: +因为接口与实现只依赖于判断两个类型的方法,所以没有必要定义一个具体类型和它实现的接口之间的关系。也就是说,有意地在文档里说明或者程序上断言这种关系偶尔是有用的,但程序上不强制这么做。这种写法还可用于让编译器在编译期确保某个类型确实满足接口要求,从而提前发现实现遗漏或接口变更导致的不匹配问题。下面的定义在编译期断言一个`*bytes.Buffer`的值实现了io.Writer接口类型: ```go // *bytes.Buffer must satisfy io.Writer @@ -150,3 +150,4 @@ type Streamer interface { ``` 每一个具体类型的组基于它们相同的行为可以表示成一个接口类型。不像基于类的语言,他们一个类实现的接口集合需要进行显式的定义,在Go语言中我们可以在需要的时候定义一个新的抽象或者特定特点的组,而不需要修改具体类型的定义。当具体的类型来自不同的作者时这种方式会特别有用。当然也确实没有必要在具体的类型中指出这些共性。 +