Go简介(特性与环境搭建)

特性

编译快
语言设计具有正交性:go的多个特性之间都是正交的:goroutine、接口、组合等
面向接口编程 & 使用组合编程:内置并发支持、无继承
支持并发:更好的利用多核
自带垃圾回收:go具有垃圾回收机制

计算机一直在演化,但是编程语言并没有以同样的速度演化。现在的手机,内置的 CPU 核数可能都多于我们使用的第一台电脑。高性能服务器拥有 64 核、128 核,甚至更多核。但是我们依旧在使用为单核设计的技术在编程。

Go 语言区别于其他编程语言的地方。Go 语言对传统的面向对象开发进行了重新思考,并且提供了更高效的复用代码的手段。Go 语言还让用户能更高效地利用昂贵服务器上的所有核心,而且它编译大型项目的速度也很快。
编译快
Go 语言使用了更加智能的编译器,并简化了解决依赖的算法,最终提供了更快的编译速度。编译 Go 程序时,编译器只会关注那些直接被引用的库,而不是像 Java、C 和 C++那样,要遍历依赖链中所有依赖的库。因此,很多 Go 程序可以在 1 秒内编译完。在现代硬件下,整个源码树编译只需20秒。
面向接口编程
Go 语言提供了灵活的、无继承的类型系统。
这个类型系统依然支持面向对象开发,但避免了传统面向对象的问题。
Go 开发者使用组合设计模式,只需简单地将一个类型嵌入到另一个类型,就能复用所有的功能。
其他语言也能使用组合,但是不得不和继承绑在一起使用,结果使整个用法相对比较复杂。在 Go 语言中,一个类型由其他更微小的类型组合而成。
Go语言还具有独特的接口实现机制,允许用户对行为进行建模,而不是对类型进行建模。在 Go 语言中,不需要声明某个类型实现了某个接口,编译器会判断一个类型的实例是否符合正在使用的接口。Go 标准库里的很多接口都非常简单,只开放几个函数。从实践上讲,尤其对那些使用类似 Java 的面向对象语言的人来说,需要一些时间才能习惯这个特性。

并发
Go 语言对并发的支持是这门语言最重要的特性之一(Goroutine与通道)。
1、Goroutine:
goroutine 是可以与其他 goroutine 并行执行的函数,同时也会与主程序(程序的入口)并行执行。在其他编程语言中,你需要用线程来完成同样的事情,而在 Go 语言中会使用同一个线程来执行多个 goroutine。例如,用户在写一个 Web 服务器,希望同时处理不同的 Web 请求,如果使用 C 或者 Java,不得不写大量的额外代码来使用线程。在 Go 语言中,net/http 库直接使用了内置的 goroutine。每个接收到的请求都会交给自己的至少一个 goroutine 来处理。goroutine 使用的内存比线程更少,Go 语言运行时会自动在配置的一组逻辑处理器上调度执行 goroutine。逻辑处理器与操作系统线程是1:1的关系。Go默认是给每个可用的物理处理器都分配一个逻辑处理器,16核默认会分配16个,这让用户的应用程序执行效率更高,而开发工作量显著减少。

概念 说明
进程: 一个程序对应一个独立程序空间
线程 :一个执行空间,一个进程可以有多个线程
逻辑处理器: 执行创建的goroutine,绑定一个线程
调度器 :Go运行时中的,分配goroutine给不同的逻辑处理器
全局运行队列: 所有刚创建的goroutine都会放到这里
本地运行队列: 逻辑处理器的goroutine队列

当我们创建一个goroutine的后,会先存放在全局运行队列中,等待Go运行时的调度器进行调度,把他们分配给其中的一个逻辑处理器,并放到这个逻辑处理器对应的本地运行队列中,最终等着被逻辑处理器执行即可。
下图的简单程序可直观感受并发的过程
在这里插入图片描述
先开了一个主线程:”wg”, 然后用” go” 声明了两个goroutine, 主线程等待两个goroutine Done, Go首先会根据实际的物理核心数创建逻辑处理器,由于124只有1核,所以会创建1个。可看出结果显然不是顺序执行的。
在这里插入图片描述
如果是其他多核服务器,结果应该是并发和并行交织的

2、通道:
通道是一种数据结构,可以让 goroutine 之间进行安全的数据通信。通道可以帮用户避免其他语言里常见的共享内存访问的问题。
并发的最难的部分就是要确保其他并发运行的进程、线程或 goroutine 不会意外修改用户的数据。当不同的线程在没有同步保护的情况下修改同一个数据时,总会发生灾难。在其他语言中,如果使用全局变量或者共享内存,必须使用复杂的锁规则来防止对同一个变量的不同步修改。
为了解决这个问题,通道提供了一种新模式,从而保证并发修改时的数据安全。通道这一模式保证同一时刻只会有一个 goroutine 修改数据。通道用于在几个运行的 goroutine 之间发送数据。这种在 goroutine 之间安全传输数据的方法不需要额外的任何锁或者同步机制。
在这里插入图片描述

内存管理

Go 语言拥有现代化的垃圾回收机制。虽然 Go 语言的垃圾回收会有一些额外的开销,但是编程时,能显著降低开发难度。
LINUX

环境

解压:
tar -zxf go1.7.3.linux-amd64.tar.gz -C /usr/local/src
mkdir /home/go
环境变量:
在 /etc/profile 添加:
export GOROOT=/usr/local/go
export GOBIN= G O R O O T / b i n e x p o r t G O P K G = GOROOT/bin export GOPKG= GOROOT/binexportGOPKG=GOROOT/pkg/tool/linux_amd64
export GOPATH=/home/go
export PATH= P A T H : PATH: PATH:GOBIN: G O P K G : GOPKG: GOPKG:GOPATH/bin

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值