首页 > 编程笔记 > Go语言笔记

Go语言的特性有哪些?

Go语言也称为 Golang,是由 Google 公司开发的一种静态强类型、编译型、并发型、并具有垃圾回收功能的编程语言。

Go语言的特性可以归纳为以下几点:

下面就来分别介绍一下。

1) 自动垃圾回收

曾几何时,内存管理是应用开发的一大难题,传统的系统级编程语言 C/C++ 中,开发人员必须小心的对内存进行管理操作,控制内存的申请及释放。处理不当,就可能产生内存泄露问题,这种问题不易发现并且难以定位,一直成为困扰开发人员的障碍。

与 C/C++ 语言不同,在Go语言中不需要开发人员时刻考虑着内存的回收,Go语言内置的垃圾回收器会自动帮我们完成这些工作,大大提高了我们的开发效率。

2) 更丰富的内置类型

除了几乎所有语言都支持的简单内置类型(比如整型、浮点型等)外,Go语言还支持一些其他的高级类型,比如字典类型,字典类型在其他语言中都是通过包的形式引入的外部数据类型。

此外还有数组切片(Slice),它在Go语言中也是一种内置的数据类型,通常作为动态数组来使用,类似于 C++ STL 中的 vector。

3) 函数多返回值

在C语言以及其他的一些高级语言中函数是不支持包含多个返回值的,但是这项功能又确实是需要的,所以在C语言中一般通过将返回值定义成一个结构体,或者通过函数的参数引用的形式进行返回。

Go语言在静态语言阵营中率先提供了函数的多返回值功能。这个特性让开发人员可以在函数内部同时 return 多个返回值,不用再为了返回多个值而专门定义一个数据类型。

4) 错误处理

在传统的面向对象(OOP)编程中,为了确保程序的健壮性需要捕获异常,使用的方法大都是 try...catch 语句。

在Go语言中不支持 try...catch 这样的异常处理方式,而是引入了三个关键字,分别是 defer、panic 和 recover,其中使用 defer 语句的含义是不管程序是否出现异常,均在函数退出时自动执行相关代码,另外两个关键字则是分别用来终止程序和让终止的程序恢复运行。

Go语言的错误处理机制可以减少代码量,让开发人员无需使用大量的 try...catch 语句,有利于后期代码的阅读和维护。

5) 面向对象

Go语言虽然支持面向对象编程,但是和传统的面向对象有区别,去掉了传统面向对象的继承、方法重载、构造函数和析构函数等等,所以说Go语言并不是纯粹的面向对象编程语言。

而且,Go语言中没有类的概念,但是Go语言的结构体(struct)和其他语言的类(Class)有同等地位,也就是说Go语言是基于结构体来实现面向对象概念的。

6) 并发编程

Go语言引入了 goroutine(轻量级线程)概念,goroutine 是一种比线程更加轻盈、更省资源的协程,通过在函数调用前使用关键字 go,即可让该函数以 goroutine 方式执行。

同时,Go语言使用 channel(通道)这个概念实现了 CSP(通信顺序进程,Communicating Sequential Process)模型来作为 goroutine  间的通信方式。channel 的使用方式比较接近 Unix 系统中的管道(pipe)概念,可以方便地进行跨 goroutine 的通信。

Go语言通过使用 goroutine 而不是直接使用操作系统的并发机制,以及使用 channel 来进行跨 goroutine 通信而不是使用共享内存来通信,这让并发编程变得更加安全和便捷。

7) 反射

反射(reflection)是在Java语言出现后迅速流行起来的一种概念。通过反射,可以获取对象类型的详细信息,并可动态操作对象。反射是把双刃剑,功能强大但代码可读性并不理想,若非必要,并不推荐使用反射。

Go语言中的反射和 Java 中的反射类似,但没有像Java语言那样内置类型工厂,所以无法做到像 Java 那样通过类型字符串创建对象实例。

Go语言中反射最常见的使用场景是对数据进行格式化(有时候也叫 Marshal & Unmarshal)。例如,Go语言标准库的 encoding/json、encoding/xml、encoding/gob、encoding/binary 等包就大量依赖于反射功能来实现。

8) 语言的交互性

语言交互性指的是语言本身是否能和其他语言交互,比如可以调用其他语言编译的库。

因为Go语言与C语言之间存在天生联系(Go语言是以C语言为原型而设计的),所以在Go语言中直接重用了大部份的 C 模块,这里称为 Cgo。Cgo 既是语言特性,同时也是一个工具的名称。

在Go语言代码中,可以按 Cgo 的特定语法混合编写C语言代码,然后 Cgo 可以将这些混合的C语言代码提取并生成用于调用C功能的代码。开发者基本上可以完全忽略Go语言和C语言的边界是如何跨越的。

9) 编译

编译涉及到两个问题,分别是编译速度和依赖管理。

另外,编译时编译器会默认检查代码中所有变量、方法、库等等的使用情况,只要存在没有使用到的,都会编译不通过。

以上便是本节中总结出来的Go语言的特性,大家可能会有很多不理解的地方,不过没有关系,本节主要是为了让刚刚接触Go语言的读者对Go语言有一个大概的了解,后面我们会为大家做详细的介绍。

所有教程

优秀文章