专栏首页学院君的专栏Go 语言面向对象教程 —— Go 语言的类型系统

Go 语言面向对象教程 —— Go 语言的类型系统

对于面向对象编程的支持,Go 语言的实现可以说是完全颠覆了以往我们对面向对象编程的认知,下面我们先通过对 Go 语言类型系统的介绍让你有一个整体的认知。

Go 语言面向对象编程设计得简洁而优雅。

简洁之处在于,Go 语言并没有沿袭传统面向对象编程中的诸多概念,比如类的继承、接口的实现、构造函数和析构函数、隐藏的 this 指针等,也没有 public、protected、private 之类的可见性修饰符。

优雅之处在于,Go 语言对面向对象编程的支持是语言类型系统中的天然组成部分,整个类型系统通过接口串联,浑然一体。

很少有编程类的书谈及类型系统这个话题,实际上类型系统才是一门编程语言的地基,它的地位至关重要。因此,这里我们将从类型系统入手介绍 Go 语言的面向对象编程特性。

顾名思义,类型系统是指一个语言的类型体系结构。一个典型的类型系统通常包含如下基本内容:

  • 基础类型,如 byteintboolfloatstring 等;
  • 复合类型,如数组、切片、 字典、结构体、指针等;
  • 可以指向任意对象的类型(Any 类型);
  • 值语义和引用语义;
  • 面向对象,即所有具备面向对象特征(比如成员方法)的类型;
  • 接口。

类型系统描述的是这些内容在一个语言中如何被关联。因为 Java 语言自诞生以来被称为最纯正的面向对象语言,所以我们就先以 Java 语言为例讲一讲类型系统。

在 Java 语言中,存在两套完全独立的类型系统:一套是值类型系统,主要是基本类型,如 byteintbooleanchardouble 等,这些类型基于值语义;一套是以 Object 类型为根的对象类型系统,这些类型可以定义成员变量和成员方法,可以有虚函数,基于引用语义,只允许在堆上创建(通过使用关键字 new)。Java 语言中的 Any 类型就是整个对象类型系统的根 —— java.lang.Object 类型,只有对象类型系统中的实例才可以被 Any类型引用。值类型想要被 Any 类型引用,需要装箱 (boxing)过程,比如 int 类型需要装箱成为 Integer 类型。另外,只有对象类型系统中的类型才可以实现接口,具体方法是让该类型从要实现的接口继承。

相比之下,Go 语言中的大多数类型都是值语义,并且都可以包含对应的操作方法。在需要的时候,你可以给任何类型(包括内置类型)增加新方法。而在实现某个接口时,无需从该接口继承(事实上,Go 语言根本就不支持面向对象思想中的继承、实现语法),只需要实现该接口要求的所有方法即可。任何类型都可以被 Any 类型引用。在 Go 语言中,Any 类型就是空接口,即 interface{}

注:这里的值语义和引用语义等价于之前介绍类型时提到的值类型和引用类型。

接下来我们会对 Go 语言类型系统的特点逐一进行讲解。

声明:Go 语言类型系统篇内容节选自自《Go 语言编程》(许式伟等著)中类型系统一节。

本文分享自微信公众号 - 学院君的后花园(geekacademy),作者:学院君

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-07-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Go 语言基础入门教程 —— 数据类型篇:概述和布尔类型

    相较于 PHP,多出了字符类型(单个字符)、错误类型和复数类型,PHP 通过系统级配置函数 error_reporting 定义应用的错误报告级别,不区分单独的...

    学院君
  • Go 语言基础入门教程 —— 第一个 Go 程序

    使用 Go 语言之前,首先要安装 Go。Go 为 Linux、Mac、Windows 等不同的平台分别提供了相应的安装包:https://golang.goog...

    学院君
  • Go 语言基础入门系列教程 —— 预热篇

    Go 语言又称 Golang,由 Google 公司于 2009 年发布,近几年伴随着云计算、微服务、分布式的发展而迅速崛起,跻身主流编程语言之列,和 Java...

    学院君
  • [Go]GO语言实战-类型声明语句

    类型声明语句一般出现在包一级,因此如果新创建的类型名字的首字符大写,则在包外部也可以使用。

    陶士涵
  • 医疗人工智能系统努力在IT系统上表现良好

    近年来,医疗保健中人工智能的期望水平达到了高潮,一些试点项目取得了积极的早期成果。这些项目中的大多数涉及AI系统正在训练医学数据的样本数据集,例如X射线或其他医...

    Java架构师历程
  • 《C#图解教程》读书笔记之二:存储、类型和变量

      (1)C程序是一组函数和数据类型,C++程序是一组函数和类,而C#程序是一组类型声明;

    Edison Zhou
  • 类型即正义:TypeScript 从入门到实践(二):函数、交叉/联合类型与类型守卫

    了解了基础的 TS 类型,接口之后,我们开始了解如何给更加复杂的结构注解类型,这就是我们这节里面要引出的函数,进而我们讲解如何对类型进行运算:交叉类型和联合类型...

    一只图雀
  • 两个Go语言编程小技巧

    我们可以使用一个for-range循环遍历一个尺寸为零的数组值来模拟for i in 0..N。比如,下面这个循环将打印出0到9这十个数字。

    刘老貘
  • JS基础知识总结(一)

    number、string、boolean、undefined、object、function、symbol

    前端林子
  • 类型即正义:TypeScript 从入门到实践(三):类型别名和类

    学习了注解函数,又了解了类型运算如联合类型和交叉类型,接下来我们来了解一些 TS 中独有的类型别名,它类似 JS 变量,是类型变量,接着我们还会学习 TS 中内...

    一只图雀

扫码关注云+社区

领取腾讯云代金券