Ezreal 书架 Ezreal 书架
Home
  • 《Go程序员面试笔试宝典》
  • 《RabbitMQ 实战指南》
  • 《深入理解kafka》
  • MySQL45讲
  • 透视HTTP协议
  • 结构化数据的分布式存储系统
  • Raft 共识算法
Home
  • 《Go程序员面试笔试宝典》
  • 《RabbitMQ 实战指南》
  • 《深入理解kafka》
  • MySQL45讲
  • 透视HTTP协议
  • 结构化数据的分布式存储系统
  • Raft 共识算法
  • 逃逸分析

  • 延迟语句

  • 数据容器

  • 通道

  • 接口

    • Go 接口与 C++接口有何异同
    • Go 语言与“鸭子类型”的关系
    • iface 和 eface 的区别是什么
    • 值接收者和指针接收者的区别
    • 如何用 interface 实现多态
    • 接口的动态类型和动态值是什么
    • 接口转换的原理是什么
    • 类型转换和断言的区别是什么
    • 如何让编译器自动检测类型是否实现了接口
  • unsafe

  • context

  • Go程序员面试笔试宝典
  • 接口
ezreal_rao
2023-05-08

Go 接口与 C++接口有何异同

接口定义了一种规范,描述了类的行为和功能,而不做具体实现。

C++ 的接口使用抽象类实现,如果类中至少有一个函数被声明为纯虚函数,则这个类就是抽象 类。纯虚函数是通过在声明中使用 “= 0” 来指定的。例如:

class Shape
{
    public:
        // 纯虚函数
        virtual double getArea() = 0;
    private:
        string name; // 名称
};
1
2
3
4
5
6
7
8

其中,getArea () 就是纯虚函数。 设计抽象类的目的是为了给其他类提供一个可以继承的适当的基类。抽象类不能被用于实例化对象,它只能作为接口使用。

派生类需要明确地声明它继承自基类,并且需要实现基类中所有的纯虚函数。

C++ 定义接口的方式称为 “侵入式”,而 Go 采用的是 “非侵入式”,不需要显式声明,只需要实现接口定义的函数,编译器就会自动识别。

C++ 和 Go 在定义接口方式上的不同,也导致了在底层实现上的不同。C++ 通过虚函数表来实现基类调用派生类的函数;而 Go 通过 itab 中的 fun 字段来实现接口变量调用实体类型的函数。C++ 中的虚函数表是在编译期生成的;而 Go 的 itab 中的 fun 字段是在运行期间动态生成的。原因在于,Go 程序中实体类型可能会无意中实现 N 个接口,很多接口并不是开发人员需要的,所以不能为类型实现的所有接口都生成一个 itab,这也是 “非侵入式” 带来的影响;而这在 C++ 中是不存在的,因为派生需要显示声明它继承自哪个基类。

#go#interface
上次更新: 5/9/2023, 10:58:32 AM
通道操作的情况总结
Go 语言与“鸭子类型”的关系

← 通道操作的情况总结 Go 语言与“鸭子类型”的关系→

最近更新
01
为什么我的MySQL会抖一下
07-15
02
HTTP 性能优化面面观
07-12
03
WebSocket:沙盒里的 TCP
07-12
更多文章>
Theme by Vdoing | Copyright © 2022-2024 Ezreal Rao | CC BY-NC-SA 4.0
豫ICP备2023001810号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式