Go语言核心特性简介

Go代码编译成机器码不仅非常迅速,还具有方便的垃圾收集机制和强大的运行时反射机制。它是一个快速的、静态类型的编译型语言,但表现的却像动态类型的解释型语言。

Go语言的主要特性有:

1. 并发编程

Go语言在并发编程方面比绝大多数语言要简介不少。不同于传统的多线程或多进程,Go语言的并发执行单元是一种称为goroutine的协程。协程又称微线程,比线程更轻量、开销更小、性能更高。并在语言级别提供了关键字go用来启动协程。在同一台机器上可以启动成千上万个协程。协程间一般由应用程序显示实行调度。上下文切换无需下到内核层,高效不少。协程间的通信靠独有的channel机制实现。

2. 内存回收(GC)

内存自动回收,不需要开发人员管理内存。
GC过程:先stop the world,扫描所有对象判活,把可回收对象在一段bitmap区中标记下来,接着立即start the world,恢复服务,同时启动一个专门的goroutine,回收内存到空闲list中以备复用,不物理释放,物理释放由专门线程定期来执行。GC瓶颈在于每次都要扫描所有对象来判活。待收集的对象数目越多,速度越慢。GC性能可能会随着版本不断更新会不断优化。只需要new分配内存,不需要释放。

3. 内存分配

在初始化阶段直接分配一块大内存区域,大内存被切分成各个大小等级的块,放入不同的空闲list中。对象分配空间时从空闲list中取出大小合适的内存块。内存回收时,会把不用的内存重放回空闲list。空闲内存会按照一定策略合并,以减少碎片。

4. 编译

Go语言的编译速度是非常快的。
目前Go语言具有两种编译器:
一种是建立在GCC基础上的Gccgo;
另外一种是分别针对64位x64和32位x86计算机的一套编译器;

依赖管理:
由于Go语言绝大多数第三方开源库都在github上面,在代码的import中加上对应的github路径就可以使用了,库会默认下载到工程的pkg目录下。另外,编译时会默认检查代码中所有实体的使用情况。凡是没有使用到的package或变量,都会编译不通过,这体现了Go语言严谨的一面。

5. 网络编程

去中心化、分布式,提供了丰富便捷的网络编程接口。Go语言还自带了高性能的HttpServer,通过简单的几行代码调用,就可以得到一个基于协程的高性能Web服务,维护成本极低,没有任何依赖。
socket用net.Dial(基于tcp/udp,封装了传统的connect、listen、accept等接口);
http用http.Get/Post();
rpc用client.Call(‘class_name.method_name’, args, &reply);

6. 函数多返回值

允许函数返回多个值,在某些场景下,可以有效的简化编程。
Go语言推荐的编程风格,是函数返回的最后一个参数为error类型(只要逻辑体中可能出现异常),这样,在语言级别支持多返回值,就很有必要了。

7. 语言交互性

语言交互性指的是本语言是否能和其他语言交互,比如可以调用其他语言编译的库。
Go可以和C程序交互。在Go语言中直接重用了大部分的C模块,这里称为Cgo。Cgo允许开发者混合编写C语言代码,然后Cgo工具可以将这些混合的C代码,提取并生成对于C功能的调用包装代码。

8. 异常处理

Go语言不支持try catch这样的结构化的异常解决方式。Go语言提供的异常处理方式是:如果是普通异常,查看被调用方返回的error对象;如果是严重异常,指的是中断性panic(比如除0),使用defer…recover…panic机制来捕获处理。严重异常一般由Go语言内部自动抛出,不需要用户主动抛出,避免传统try…catch写得到处都是的情况。

三个重要关键字deferpanicrecover
defer是函数结束后执行,呈先进后出;
panic是程序出现无法修复的错误时使用,但会让defer执行完;
recover会修复错误,不至于程序终止。当不确定函数不会出错时使用defer+recover。

9. 其它特性

类型推导:在定义变量的时候支持var abc = 10这样的语法,让Go语言看上去有点像动态类型语言,但Go语言实际上是强类型的。这个定义会被自动推导出是int类型。

接口interface:一个类型只要实现了某个interface的所有方法,即可实现该interface,无需显式去继承。Go编程规范推荐每个Interface只提供一到两个的方法,这样使得每个接口的目的非常清晰。

defer机制:在Go语言中提供关键字defer,可以通过该关键字指定需要延迟执行的逻辑体。即在函数return前或出现panic时执行。这种机制非常适合善后逻辑处理,比如可以尽早避免可能出现的资源泄漏问题。可以说,defer是继gorountine和channel之后,另一个非常重要、实用的语言特性。对defer的引入,在很大程度上可以简化编程。

“包”的概念:与Python中包的概念类似,把相同功能的代码放到一个目录下,称之为包。包可以被其它包引用,main包是用来生成可执行文件。每个程序只有一个main包。包的主要用途是提高代码的可复用性。包是为了提高代码的可复用性。

交叉编译:例如可以在Linux的机器上开发运行Windows下运行的应用程序。Go是第一门完全支持UTF-8的编程语言,不仅体现在它可以处理使用UTF-8编码的字符串,就连它的源码文件格式都是使用的UTF-8编码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值