From 36d5fa4efbc7ecc94bb9da52bf04620916ef319c Mon Sep 17 00:00:00 2001 From: huchao <2557523039@qq.com> Date: Thu, 15 Dec 2022 22:15:04 +0800 Subject: [PATCH] =?UTF-8?q?feat:add=20=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../GOALNG_INTERVIEW_COLLECTION.md | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/golang/go-Interview/GOALNG_INTERVIEW_COLLECTION.md b/golang/go-Interview/GOALNG_INTERVIEW_COLLECTION.md index 415d7fd5..af3ec939 100644 --- a/golang/go-Interview/GOALNG_INTERVIEW_COLLECTION.md +++ b/golang/go-Interview/GOALNG_INTERVIEW_COLLECTION.md @@ -1170,6 +1170,29 @@ func main() { ### 10、[Go 接口与 C++ 接口有何异同](http://golang.design/go-questions/interface/compare-to-cpp/) +接口定义了一种规范,描述了类的行为和功能,而不做具体实现。 + +C++ 的接口是使用抽象类来实现的,如果类中至少有一个函数被声明为纯虚函数,则这个类就是抽象类。纯虚函数是通过在声明中使用 “= 0” 来指定的。例如: + +```go +class Shape +{ + public: + // 纯虚函数 + virtual double getArea() = 0; + private: + string name; // 名称 +}; +``` + +设计抽象类的目的,是为了给其他类提供一个可以继承的适当的基类。抽象类不能被用于实例化对象,它只能作为接口使用。 + +派生类需要明确地声明它继承自基类,并且需要实现基类中所有的纯虚函数。 + +C++ 定义接口的方式称为“侵入式”,而 Go 采用的是 “非侵入式”,不需要显式声明,只需要实现接口定义的函数,编译器自动会识别。 + +C++ 和 Go 在定义接口方式上的不同,也导致了底层实现上的不同。C++ 通过虚函数表来实现基类调用派生类的函数;而 Go 通过 `itab` 中的 `fun` 字段来实现接口变量调用实体类型的函数。C++ 中的虚函数表是在编译期生成的;而 Go 的 `itab` 中的 `fun` 字段是在运行期间动态生成的。原因在于,Go 中实体类型可能会无意中实现 N 多接口,很多接口并不是本来需要的,所以不能为类型实现的所有接口都生成一个 `itab`, 这也是“非侵入式”带来的影响;这在 C++ 中是不存在的,因为派生需要显示声明它继承自哪个基类。 + ## 四**、context相关** ### **1、context 结构是什么样的?context 使用场景和用途?**