go语言第三方库安装使用 go语言环境安装教程
golang使用Nsq
1. 介绍
创新互联建站专注于泰州网站建设服务及定制,我们拥有丰富的企业做网站经验。 热诚为您提供泰州营销型网站建设,泰州网站制作、泰州网页设计、泰州网站官网定制、微信小程序定制开发服务,打造泰州网络公司原创品牌,更为您提供泰州网站排名全网营销落地服务。
最近在研究一些消息中间件,常用的MQ如RabbitMQ,ActiveMQ,Kafka等。NSQ是一个基于Go语言的分布式实时消息平台,它基于MIT开源协议发布,由bitly公司开源出来的一款简单易用的消息中间件。
官方和第三方还为NSQ开发了众多客户端功能库,如官方提供的基于HTTP的nsqd、Go客户端go-nsq、Python客户端pynsq、基于Node.js的JavaScript客户端nsqjs、异步C客户端libnsq、Java客户端nsq-java以及基于各种语言的众多第三方客户端功能库。
1.1 Features
1). Distributed
NSQ提供了分布式的,去中心化,且没有单点故障的拓扑结构,稳定的消息传输发布保障,能够具有高容错和HA(高可用)特性。
2). Scalable易于扩展
NSQ支持水平扩展,没有中心化的brokers。内置的发现服务简化了在集群中增加节点。同时支持pub-sub和load-balanced 的消息分发。
3). Ops Friendly
NSQ非常容易配置和部署,生来就绑定了一个管理界面。二进制包没有运行时依赖。官方有Docker image。
4.Integrated高度集成
官方的 Go 和 Python库都有提供。而且为大多数语言提供了库。
1.2 组件
1.3 拓扑结构
NSQ推荐通过他们相应的nsqd实例使用协同定位发布者,这意味着即使面对网络分区,消息也会被保存在本地,直到它们被一个消费者读取。更重要的是,发布者不必去发现其他的nsqd节点,他们总是可以向本地实例发布消息。
NSQ
首先,一个发布者向它的本地nsqd发送消息,要做到这点,首先要先打开一个连接,然后发送一个包含topic和消息主体的发布命令,在这种情况下,我们将消息发布到事件topic上以分散到我们不同的worker中。
事件topic会复制这些消息并且在每一个连接topic的channel上进行排队,在我们的案例中,有三个channel,它们其中之一作为档案channel。消费者会获取这些消息并且上传到S3。
nsqd
每个channel的消息都会进行排队,直到一个worker把他们消费,如果此队列超出了内存限制,消息将会被写入到磁盘中。Nsqd节点首先会向nsqlookup广播他们的位置信息,一旦它们注册成功,worker将会从nsqlookup服务器节点上发现所有包含事件topic的nsqd节点。
nsqlookupd
2. Internals
2.1 消息传递担保
1)客户表示已经准备好接收消息
2)NSQ 发送一条消息,并暂时将数据存储在本地(在 re-queue 或 timeout)
3)客户端回复 FIN(结束)或 REQ(重新排队)分别指示成功或失败。如果客户端没有回复, NSQ 会在设定的时间超时,自动重新排队消息
这确保了消息丢失唯一可能的情况是不正常结束 nsqd 进程。在这种情况下,这是在内存中的任何信息(或任何缓冲未刷新到磁盘)都将丢失。
如何防止消息丢失是最重要的,即使是这个意外情况可以得到缓解。一种解决方案是构成冗余 nsqd对(在不同的主机上)接收消息的相同部分的副本。因为你实现的消费者是幂等的,以两倍时间处理这些消息不会对下游造成影响,并使得系统能够承受任何单一节点故障而不会丢失信息。
2.2 简化配置和管理
单个 nsqd 实例被设计成可以同时处理多个数据流。流被称为“话题”和话题有 1 个或多个“通道”。每个通道都接收到一个话题中所有消息的拷贝。在实践中,一个通道映射到下行服务消费一个话题。
在更底的层面,每个 nsqd 有一个与 nsqlookupd 的长期 TCP 连接,定期推动其状态。这个数据被 nsqlookupd 用于给消费者通知 nsqd 地址。对于消费者来说,一个暴露的 HTTP /lookup 接口用于轮询。为话题引入一个新的消费者,只需启动一个配置了 nsqlookup 实例地址的 NSQ 客户端。无需为添加任何新的消费者或生产者更改配置,大大降低了开销和复杂性。
2.3 消除单点故障
NSQ被设计以分布的方式被使用。nsqd 客户端(通过 TCP )连接到指定话题的所有生产者实例。没有中间人,没有消息代理,也没有单点故障。
这种拓扑结构消除单链,聚合,反馈。相反,你的消费者直接访问所有生产者。从技术上讲,哪个客户端连接到哪个 NSQ 不重要,只要有足够的消费者连接到所有生产者,以满足大量的消息,保证所有东西最终将被处理。对于 nsqlookupd,高可用性是通过运行多个实例来实现。他们不直接相互通信和数据被认为是最终一致。消费者轮询所有的配置的 nsqlookupd 实例和合并 response。失败的,无法访问的,或以其他方式故障的节点不会让系统陷于停顿。
2.4 效率
对于数据的协议,通过推送数据到客户端最大限度地提高性能和吞吐量的,而不是等待客户端拉数据。这个概念,称之为 RDY 状态,基本上是客户端流量控制的一种形式。
efficiency
2.5 心跳和超时
组合应用级别的心跳和 RDY 状态,避免头阻塞现象,也可能使心跳无用(即,如果消费者是在后面的处理消息流的接收缓冲区中,操作系统将被填满,堵心跳)为了保证进度,所有的网络 IO 时间上限势必与配置的心跳间隔相关联。这意味着,你可以从字面上拔掉之间的网络连接 nsqd 和消费者,它会检测并正确处理错误。当检测到一个致命错误,客户端连接被强制关闭。在传输中的消息会超时而重新排队等待传递到另一个消费者。最后,错误会被记录并累计到各种内部指标。
2.6 分布式
因为NSQ没有在守护程序之间共享信息,所以它从一开始就是为了分布式操作而生。个别的机器可以随便宕机随便启动而不会影响到系统的其余部分,消息发布者可以在本地发布,即使面对网络分区。
这种“分布式优先”的设计理念意味着NSQ基本上可以永远不断地扩展,需要更高的吞吐量?那就添加更多的nsqd吧。唯一的共享状态就是保存在lookup节点上,甚至它们不需要全局视图,配置某些nsqd注册到某些lookup节点上这是很简单的配置,唯一关键的地方就是消费者可以通过lookup节点获取所有完整的节点集。清晰的故障事件——NSQ在组件内建立了一套明确关于可能导致故障的的故障权衡机制,这对消息传递和恢复都有意义。虽然它们可能不像Kafka系统那样提供严格的保证级别,但NSQ简单的操作使故障情况非常明显。
2.7 no replication
不像其他的队列组件,NSQ并没有提供任何形式的复制和集群,也正是这点让它能够如此简单地运行,但它确实对于一些高保证性高可靠性的消息发布没有足够的保证。我们可以通过降低文件同步的时间来部分避免,只需通过一个标志配置,通过EBS支持我们的队列。但是这样仍然存在一个消息被发布后马上死亡,丢失了有效的写入的情况。
2.8 没有严格的顺序
虽然Kafka由一个有序的日志构成,但NSQ不是。消息可以在任何时间以任何顺序进入队列。在我们使用的案例中,这通常没有关系,因为所有的数据都被加上了时间戳,但它并不适合需要严格顺序的情况。
2.9 无数据重复删除功能
NSQ对于超时系统,它使用了心跳检测机制去测试消费者是否存活还是死亡。很多原因会导致我们的consumer无法完成心跳检测,所以在consumer中必须有一个单独的步骤确保幂等性。
3. 实践安装过程
本文将nsq集群具体的安装过程略去,大家可以自行参考官网,比较简单。这部分介绍下笔者实验的拓扑,以及nsqadmin的相关信息。
3.1 拓扑结构
topology
实验采用3台NSQD服务,2台LOOKUPD服务。
采用官方推荐的拓扑,消息发布的服务和NSQD在一台主机。一共5台机器。
NSQ基本没有配置文件,配置通过命令行指定参数。
主要命令如下:
LOOKUPD命令
NSQD命令
工具类,消费后存储到本地文件。
发布一条消息
3.2 nsqadmin
对Streams的详细信息进行查看,包括NSQD节点,具体的channel,队列中的消息数,连接数等信息。
nsqadmin
channel
列出所有的NSQD节点:
nodes
消息的统计:
msgs
lookup主机的列表:
hosts
4. 总结
NSQ基本核心就是简单性,是一个简单的队列,这意味着它很容易进行故障推理和很容易发现bug。消费者可以自行处理故障事件而不会影响系统剩下的其余部分。
事实上,简单性是我们决定使用NSQ的首要因素,这方便与我们的许多其他软件一起维护,通过引入队列使我们得到了堪称完美的表现,通过队列甚至让我们增加了几个数量级的吞吐量。越来越多的consumer需要一套严格可靠性和顺序性保障,这已经超过了NSQ提供的简单功能。
结合我们的业务系统来看,对于我们所需要传输的发票消息,相对比较敏感,无法容忍某个nsqd宕机,或者磁盘无法使用的情况,该节点堆积的消息无法找回。这是我们没有选择该消息中间件的主要原因。简单性和可靠性似乎并不能完全满足。相比Kafka,ops肩负起更多负责的运营。另一方面,它拥有一个可复制的、有序的日志可以提供给我们更好的服务。但对于其他适合NSQ的consumer,它为我们服务的相当好,我们期待着继续巩固它的坚实的基础。
第三方库使用步骤是123
官方下载第三方库并解压包,将解压包放入安装目录,电脑开始菜单,运行。
第三方库是一种为了方便编写出程序或者方便办公的一种外来安装的库,不同于本地库,因此需要安装才可以使用。
如何引用第三方 resty 库
和大部分知名开源软件诞生在欧美国家不同,OpenResty自身和依赖的主要组件都是金砖国家的开发者发明的,这点还挺有意思。
Nginx是俄罗斯人发明的,Lua是巴西几个教授发明的,中国人章亦春把LuaJITVM嵌入到Nginx中,实现了OpenResty这个高性能服务端解决方案。
通过OpenResty,你可以把nginx的各种功能进行自由拼接,更重要的是,开发门槛并不高,这一切都是用强大轻巧的Lua语言来操控。
它主要的使用场景主要是:
在Lua中揉和和处理各种不同的nginx上游输出(Proxy,Postgres,Redis,Memcached等)
在请求真正到达上游服务之前,Lua可以随心所欲的做复杂的访问控制和安全检测
随心所欲的操控响应头里面的信息
从外部存储服务(比如Redis,Memcached,MySQL,Postgres)中获取后端信息,并用这些信息来实时选择哪一个后端来完成业务访问
在内容handler中随意编写复杂的Web应用,使用同步但依然非阻塞的方式,访问后端数据库和其他存储
在rewrite阶段,通过Lua完成非常复杂的URLdispatch
用Lua可以为nginx子请求和任意location,实现高级缓存机制
组织OpenResty技术大会之前,我一直认为自己是一个孤独的OpenResty使用者,觉得自己在使用一个冷门的技术。
虽然大家都听说过OpenResty或者ngx_lua,但感觉用在生产环境中使用的却少之又少,除了几个CDN公司外,好像没有听说过哪家知名互联网公司在使用。而CDN行业之所以使用,很多是受到cloudflare技术栈的影响,OpenResty的作者也在国外这家CDN公司。
但办完这个大会,我发现使用者真的挺多,奇虎360的所有服务端团队都在使用,京东、百度、魅族、知乎、优酷、新浪这些互联网公司都在使用。有用来写WAF、有做CDN调度、有做广告系统、消息推送系统,还有像我们部门一样,用作APIserver的。有些还用在非常关键的业务上,比如开涛在高可用架构分享的京东商品详情页,是我知道的ngx_lua最大规模的应用。
2.奇虎企业安全服务端技术选型的标准
先说下3年多前做架构选型的时候,我为什么会选择OpenResty?
其实架构如何设计并不重要,因为每家公司,每个团队,他们的公司文化和技术背景各不相同,生搬硬套会适得其反。重要的是当初为什么这么选择,中途为什么调整。
我们的产品要求单机上面,服务端提供高性能的API接口,QPS至少过万,未来需要支撑到10万。我们并没有急于去使用PHP、Python或者其他的语言来实现功能,而是先勾勒出一个理想化的技术模型。
这个模型应该具备:
非阻塞的访问网络IO。在连接MySQL、Redis和发起HTTP请求时,工作进程不能傻傻的等待网络IO的返回,而是需要支持事件驱动,用协程的方式让CPU资源更有效的去处理其他请求。很多语言并不具备这样的能力和周边库。
有完备的缓存机制。不仅需要支持Redis、Memcached等外部缓存,也应该在自己的进程内有缓存系统。我们希望大部分的请求都能在一个进程中得到数据并返回,这样是最高效的方法,一旦有了网络IO和进程间的交互,性能就会受到很大影响。
同步的写代码逻辑,不要让开发者感知到回调和异步。这个也很重要,程序员也是人,代码应该更符合人的思维习惯,显式的回调和异步关键字,会打断思路,也给调试带来困难。
最好是站在巨人肩上,基于成熟的技术上搭建。采用一门全新诞生的语言和技术,需要经历语言自身发展期频繁调整的阵痛,还可能站错队。
不仅支持Linux平台,还需要支持Windows平台,这个是我们产品很特别的需求,很多中小企业用户还是习惯Windows的操作,不具备Linux的维护能力。
基于以上几点的考虑,考察了当时的一些方案,选择了OpenResty。
首先,它最大的特点就是用同步的代码逻辑实现非阻塞的调用,其次它有单进程内的LRUcache和进程间的shareDICTcache,而且它是揉合nginx和LuaJIT而产生的。而且nginx有Windows版本,虽然有非常多的限制,但这些限制都是可以解决的,nginx官方Windows版本中不支持的特性,我们开源出来的版本都解决了。
第一次看到这样的方案,我觉得它肯定会颠覆高性能服务端的开发。为什么呢?在我之前的公司里,每天会有近百亿次的查询请求,而服务器只用了十台。
我们采用了nginxC模块+内置在nginx中的K-V数据库(自己开发的),来实现所有的业务逻辑,达到这个目标。听上去很简单,但是过程非常艰辛,两三个十几年工作经验的大牛做了一年多才稳定下来。绝大部分开发能力不足,只能望尘莫及。而且后续的调试和维护,也会花费不少精力。
但是OpenResty的出现改变了这一切,OpenResty非常的pythonic,适合人类的正常思维。新手经过一两个月的学习,做出来的API,就可以达到nginxC模块的性能,而且代码量大大减少,也方便调试。
3.以奇虎和新浪为例,如何在项目中引入新技术
技术选型只是第一步,如何才能在一个产品或者项目中引入OpenResty这个新的技术呢?我拿奇虎企业安全和新浪移动这两家公司真实发生的案例给大家看看。我和新浪移动的周晶,都是在一个有成熟产品的部门,用一两个人的力量,把一个新技术,替换掉了原有的技术架构。但由于企业产品和个人产品的不同,方法有很大的不一样。
先说我所在奇虎企业安全。我在2012年初加入这个部门,当时产品主打免费,目标用户是小企业。所以架构设计上面,只考虑了几十点、几百点的终端请求,使用了非常强绑定的Windows平台技术,而且倾向于不用开源软件,自己新做一个更适合自己的框架。包括自己用C++开发的Webserver,自己写的PHP路由和框架,数据存储在sqlite里面。
我帮忙修改了两个月PHP的bug,看明白了技术架构的思路之后,就去新开的一个产品线了。这是一个实验性的产品,主要面对央企和专用网,一个网络中有上百万的终端。
刚开始没有什么人关注,我就直接采用了Linux+OpenResty+Redis+Postgres的开源组件,性能测试甩之前的N条街。后面这个实验性的产品,和之前的产品,合并为一个产品,技术上面就割裂为两套架构。老功能用老架构,新功能用新架构。
随着越来越多大用户的增加,原有的技术架构开始捉襟见肘,技术债务越积压越多。随着用户的抱怨,sqlite被抛弃,全面换成Postgres。但对于自己开发的框架还是有些敝帚自珍。
期间通过对比测试、OpenResty培训还有多次用户性能问题排查,让开发同学们都知道这门技术的优势。快被加班压垮的开发同学,逐渐开始选择使用OpenResty而不是自研的框架,来进行新功能的开发,以及旧功能的迁移,来避免加班。
在产品重构的时候,之前自研的服务端框架被完全抛弃,服务端开发的同学从8、9个人减少到3个人。在新技术的引入过程中,我们没有采用强制的举措,因为企业产品需要稳定,用户处部署的版本更新很慢。
而新浪移动周晶的实践,对大家更有参考意义。新浪移动最开始是基于Apache,用PHP来处理用户请求。Apache是同步多进程模型,在并发请求不多的情况下没有问题。
但是总是会有突发新闻,比如马航失联、文章出轨等,突发的高流量把后台压垮了几次。而且可以预见世界杯的流量也会很大,所以周晶花几个月时间,用nginx替换了Apache,使用nginx的fast_cgi_cache,QPS提升了一个数量级。
新浪移动后台的接口都是使用PHP来实现的,在高并发下有些力不从心。而nginx简单的缓存虽然能满足性能,但不能满足业务精细化和数据一致性的要求,需要找PHP之外的解决方案,前提是让PHP的开发能够舒适的使用。node.js的回调地狱、Go的调试不方便,都是一个阻碍。
他们最后选择了OpenResty,而且基于OpenResty开源了一个Web框架Vanilla(香草),模仿了Yaf的使用习惯,让PHP的开发更容易接受和上手。Vanilla已经在新浪移动开始使用,一些核心业务,比如高清图和体育直播,正在向这个框架迁移中。
4.入门痛点,以及学习的正确方法
我和周晶的入门,都是自己摸着石头过河。当时除了Python社区「大妈」的那篇使用文章外,找不到其他的资料。
奇虎和新浪都用OpenResty成功替换了之前的技术,但问题还是挺明显,就是大家都认为自己是孤独的使用者,同事中基本没有人认同。在关键和支撑业务上,使用OpenResty有些不放心,都会在边缘业务上先做尝试和验证。
虽然OpenResty的性能做的很棒,比肩或者超过其他所有的高性能解决方案,但是担心没有学习资料、担心招不到人、担心没人交流,可能还担心作者章亦春哪天撂挑子不干了,这个项目就黄了。
高可用架构群里的各位都是架构师,是技术决策者,在引入一门新技术的时候,肯定会考虑到这些风险。比如小米科技马利超在高可用架构的分享,他们在抢购系统中曾经使用过ngx_lua,虽然性能满足需求,但是团队里面熟悉的人少,最后还是改成了Go语言实现。
如何解决这些担忧?社区是有过思考和讨论的,我们放在分享最后讲。先从一个尝试使用这门技术的开发者的角度看,OpenResty不少基础工作没有完善,友好程度不够:
只能从源码安装,没有apt-get、brew等软件仓库安装方法;安装第三方库没有PIP、NPM之类的包管理工具,需要去先谷歌,然后拷贝代码文件到指定的目录下,才能require使用。
代码编写需要修改nginx.conf和对应的lua代码,即使是helloworld也是如此。当然你可以把代码写在nginx的配置文件里面,但是生产环境肯定是要分离的。这种编写代码的方式,不像是一个编程语言,和常规的编程方式不同。
有独特的执行阶段概念,因为OpenResty是基于nginx的,所以也继承它的这种概念。你的代码逻辑,可能需要放在不同的阶段里面运行,才能获取你想要的预期。而这些阶段间信息如何传递,以及哪些API不能在某些阶段使用,就会经常拦住新手。
遇到问题只有邮件列表这一种方式来沟通,而邮件列表是被墙的。文档也只有英文版本,导致很多新手的问题无法被解决。
没有系统学习OpenResty的手段,大都是业务需要实现什么功能,就去文档和API里面去找。至于方式对不对,能不能优化,就不知道了。
手动安装 Go 第三方库
自动安装第三方库,
但是有时不能自动安装,比如没有 github 账号,这时可以选择手动安装,以 goquery 为例。
这样就可以正常使用了。
如何在linux上安装go语言
1.1 Go 安装
Go的三种安装方式
Go有多种安装方式,你可以选择自己喜欢的。这里我们介绍三种最常见的安装方式:
Go源码安装:这是一种标准的软件安装方式。对于经常使用Unix类系统的用户,尤其对于开发者来说,从源码安装可以自己定制。
Go标准包安装:Go提供了方便的安装包,支持Windows、Linux、Mac等系统。这种方式适合快速安装,可根据自己的系统位数下载好相应的安装包,一路next就可以轻松安装了。**推荐这种方式**
第三方工具安装:目前有很多方便的第三方软件包工具,例如Ubuntu的apt-get、Mac的homebrew等。这种安装方式适合那些熟悉相应系统的用户。
最后,如果你想在同一个系统中安装多个版本的Go,你可以参考第三方工具GVM,这是目前在这方面做得最好的工具,除非你知道怎么处理。
Go源码安装
在Go的源代码中,有些部分是用Plan 9 C和ATT汇编写的,因此假如你要想从源码安装,就必须安装C的编译工具。
在Mac系统中,只要你安装了Xcode,就已经包含了相应的编译工具。
在类Unix系统中,需要安装gcc等工具。例如Ubuntu系统可通过在终端中执行sudo apt-get install gcc
libc6-dev来安装编译工具。
在Windows系统中,你需要安装MinGW,然后通过MinGW安装gcc,并设置相应的环境变量。
你可以直接去官网下载源码,找相应的goVERSION.src.tar.gz的文件下载,下载之后解压缩到$HOME目录,执行如下代码:
cd go/src
./all.bash
运行all.bash后出现"ALL TESTS PASSED"字样时才算安装成功。
上面是Unix风格的命令,Windows下的安装方式类似,只不过是运行all.bat,调用的编译器是MinGW的gcc。
如果是Mac或者Unix用户需要设置几个环境变量,如果想重启之后也能生效的话把下面的命令写到.bashrc或者.zshrc里面,
export GOPATH=$HOME/gopath
export PATH=$PATH:$HOME/go/bin:$GOPATH/bin
如果你是写入文件的,记得执行bash .bashrc或者bash
.zshrc使得设置立马生效。
如果是window系统,就需要设置环境变量,在path里面增加相应的go所在的目录,设置gopath变量。
当你设置完毕之后在命令行里面输入go,看到如下图片即说明你已经安装成功
图1.1 源码安装之后执行Go命令的图
如果出现Go的Usage信息,那么说明Go已经安装成功了;如果出现该命令不存在,那么可以检查一下自己的PATH环境变中是否包含了Go的安装目录。
关于上面的GOPATH将在下面小节详细讲解
Go标准包安装
Go提供了每个平台打好包的一键安装,这些包默认会安装到如下目录:/usr/local/go
(Windows系统:c:\Go),当然你可以改变他们的安装位置,但是改变之后你必须在你的环境变量中设置如下信息:
export GOROOT=$HOME/go
export GOPATH=$HOME/gopath
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
上面这些命令对于Mac和Unix用户来说最好是写入.bashrc或者.zshrc文件,对于windows用户来说当然是写入环境变量。
如何判断自己的操作系统是32位还是64位?
我们接下来的Go安装需要判断操作系统的位数,所以这小节我们先确定自己的系统类型。
Windows系统用户请按Win+R运行cmd,输入systeminfo后回车,稍等片刻,会出现一些系统信息。在“系统类型”一行中,若显示“x64-based
PC”,即为64位系统;若显示“X86-based PC”,则为32位系统。
Mac系统用户建议直接使用64位的,因为Go所支持的Mac OS X版本已经不支持纯32位处理器了。
Linux系统用户可通过在Terminal中执行命令arch(即uname
-m)来查看系统信息:
64位系统显示
x86_64
32位系统显示
i386
Mac 安装
访问下载地址,32位系统下载go1.4.2.darwin-386-osx10.8.pkg,64位系统下载go1.4.2.darwin-amd64-osx10.8.pkg,双击下载文件,一路默认安装点击下一步,这个时候go已经安装到你的系统中,默认已经在PATH中增加了相应的~/go/bin,这个时候打开终端,输入go
看到类似上面源码安装成功的图片说明已经安装成功
如果出现go的Usage信息,那么说明go已经安装成功了;如果出现该命令不存在,那么可以检查一下自己的PATH环境变中是否包含了go的安装目录。
Linux 安装
访问下载地址,32位系统下载go1.4.2.linux-386.tar.gz,64位系统下载go1.4.2.linux-amd64.tar.gz,
假定你想要安装Go的目录为 $GO_INSTALL_DIR,后面替换为相应的目录路径。
解压缩tar.gz包到安装目录下:tar zxvf go1.4.2.linux-amd64.tar.gz -C
$GO_INSTALL_DIR。
设置PATH,export PATH=$PATH:$GO_INSTALL_DIR/go/bin
然后执行go
图1.2 Linux系统下安装成功之后执行go显示的信息
如果出现go的Usage信息,那么说明go已经安装成功了;如果出现该命令不存在,那么可以检查一下自己的PATH环境变中是否包含了go的安装目录。
Windows 安装
访问Google Code 下载页,32
位请选择名称中包含 windows-386 的 msi 安装包,64 位请选择名称中包含 windows-amd64 的。下载好后运行,不要修改默认安装目录
C:\Go\,若安装到其他位置会导致不能执行自己所编写的 Go 代码。安装完成后默认会在环境变量 Path 后添加 Go 安装目录下的 bin 目录
C:\Go\bin\,并添加环境变量 GOROOT,值为 Go 安装根目录 C:\Go\ 。
验证是否安装成功
在运行中输入 cmd 打开命令行工具,在提示符下输入 go,检查是否能看到 Usage 信息。输入
cd %GOROOT%,看是否能进入 Go 安装目录。若都成功,说明安装成功。
不能的话请检查上述环境变量 Path 和 GOROOT 的值。若不存在请卸载后重新安装,存在请重启计算机后重试以上步骤。
第三方工具安装
GVM
gvm是第三方开发的Go多版本管理工具,类似ruby里面的rvm工具。使用起来相当的方便,安装gvm使用如下命令:
bash (curl -s -S -L )
安装完成后我们就可以安装go了:
gvm install go1.4.2
gvm use go1.4.2
也可以使用下面的命令,省去每次调用gvm use的麻烦: gvm use go1.4.2 --default
执行完上面的命令之后GOPATH、GOROOT等环境变量会自动设置好,这样就可以直接使用了。
apt-get
Ubuntu是目前使用最多的Linux桌面系统,使用apt-get命令来管理软件包,我们可以通过下面的命令来安装Go,为了以后方便,应该把
git mercurial 也安装上:
sudo apt-get install python-software-properties
sudo add-apt-repository ppa:gophers/go
sudo apt-get update
sudo apt-get install golang-stable git-core mercurial
homebrew
homebrew是Mac系统下面目前使用最多的管理软件的工具,目前已支持Go,可以通过命令直接安装Go,为了以后方便,应该把
git mercurial 也安装上:
brew update brew upgrade
brew install go
brew install git
brew install mercurial
本文题目:go语言第三方库安装使用 go语言环境安装教程
本文链接:http://scyanting.com/article/doojedi.html