Go语言的特性有哪些?
Go语言也称为 Golang,是由 Google 公司开发的一种静态强类型、编译型、并发型、并具有垃圾回收功能的编程语言。
Go语言的特性可以归纳为以下几点:
下面就来分别介绍一下。
与 C/C++ 语言不同,在Go语言中不需要开发人员时刻考虑着内存的回收,Go语言内置的垃圾回收器会自动帮我们完成这些工作,大大提高了我们的开发效率。
此外还有数组切片(Slice),它在Go语言中也是一种内置的数据类型,通常作为动态数组来使用,类似于 C++ STL 中的 vector。
Go语言在静态语言阵营中率先提供了函数的多返回值功能。这个特性让开发人员可以在函数内部同时 return 多个返回值,不用再为了返回多个值而专门定义一个数据类型。
在Go语言中不支持 try...catch 这样的异常处理方式,而是引入了三个关键字,分别是 defer、panic 和 recover,其中使用 defer 语句的含义是不管程序是否出现异常,均在函数退出时自动执行相关代码,另外两个关键字则是分别用来终止程序和让终止的程序恢复运行。
Go语言的错误处理机制可以减少代码量,让开发人员无需使用大量的 try...catch 语句,有利于后期代码的阅读和维护。
而且,Go语言中没有类的概念,但是Go语言的结构体(struct)和其他语言的类(Class)有同等地位,也就是说Go语言是基于结构体来实现面向对象概念的。
同时,Go语言使用 channel(通道)这个概念实现了 CSP(通信顺序进程,Communicating Sequential Process)模型来作为 goroutine 间的通信方式。channel 的使用方式比较接近 Unix 系统中的管道(pipe)概念,可以方便地进行跨 goroutine 的通信。
Go语言通过使用 goroutine 而不是直接使用操作系统的并发机制,以及使用 channel 来进行跨 goroutine 通信而不是使用共享内存来通信,这让并发编程变得更加安全和便捷。
Go语言中的反射和 Java 中的反射类似,但没有像Java语言那样内置类型工厂,所以无法做到像 Java 那样通过类型字符串创建对象实例。
Go语言中反射最常见的使用场景是对数据进行格式化(有时候也叫 Marshal & Unmarshal)。例如,Go语言标准库的 encoding/json、encoding/xml、encoding/gob、encoding/binary 等包就大量依赖于反射功能来实现。
因为Go语言与C语言之间存在天生联系(Go语言是以C语言为原型而设计的),所以在Go语言中直接重用了大部份的 C 模块,这里称为 Cgo。Cgo 既是语言特性,同时也是一个工具的名称。
在Go语言代码中,可以按 Cgo 的特定语法混合编写C语言代码,然后 Cgo 可以将这些混合的C语言代码提取并生成用于调用C功能的代码。开发者基本上可以完全忽略Go语言和C语言的边界是如何跨越的。
另外,编译时编译器会默认检查代码中所有变量、方法、库等等的使用情况,只要存在没有使用到的,都会编译不通过。
以上便是本节中总结出来的Go语言的特性,大家可能会有很多不理解的地方,不过没有关系,本节主要是为了让刚刚接触Go语言的读者对Go语言有一个大概的了解,后面我们会为大家做详细的介绍。
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 run
命令运行一段程序的时候,几乎感受不到程序的编译过程。 - 依赖管理:由于Go语言绝大多数第三方开源库都在 github 上,所以在需要引用某个库时,直接在代码的 import 中加上该库对应的 github 路径就可以使用了,库会默认下载到工程的 pkg 目录下。
另外,编译时编译器会默认检查代码中所有变量、方法、库等等的使用情况,只要存在没有使用到的,都会编译不通过。
以上便是本节中总结出来的Go语言的特性,大家可能会有很多不理解的地方,不过没有关系,本节主要是为了让刚刚接触Go语言的读者对Go语言有一个大概的了解,后面我们会为大家做详细的介绍。
所有教程
- C语言入门
- C语言编译器
- C语言项目案例
- 数据结构
- C++
- STL
- C++11
- socket
- GCC
- GDB
- Makefile
- OpenCV
- Qt教程
- Unity 3D
- UE4
- 游戏引擎
- Python
- Python并发编程
- TensorFlow
- Django
- NumPy
- Linux
- Shell
- Java教程
- 设计模式
- Java Swing
- Servlet
- JSP教程
- Struts2
- Maven
- Spring
- Spring MVC
- Spring Boot
- Spring Cloud
- Hibernate
- Mybatis
- MySQL教程
- MySQL函数
- NoSQL
- Redis
- MongoDB
- HBase
- Go语言
- C#
- MATLAB
- JavaScript
- Bootstrap
- HTML
- CSS教程
- PHP
- 汇编语言
- TCP/IP
- vi命令
- Android教程
- 区块链
- Docker
- 大数据
- 云计算