主要目标:
兼具Python
等动态语言的开发速度和C/C++
等编译型语言的性能与安全性。支持网络编程、系统编程、并发编程、分布式编程。
Go使用编译器编译代码,编译器检查错误、优化性能并输出可在不同平台上运行的二进制文件。
Go语言为并发而生
如今,多核CPU
已经成为服务器的标配,对多核的运算能力挖掘一直由程序员人工设计算法及框架来完成,这个过程需要开发人员具有一定的并发设计及框架设计能力。Go
语言在多核并发上具有原生的设计优势,经过Go
语言重构的系统能够使用更少的硬件资源实现更高的并发和I/O
吞吐表现。
Go
语言底层原生支持并发。Go
语言的并发基于goroutine
,goroutine
是一种虚拟线程,Go
语言运行时参与调度goroutine
,并将goroutine
合理分配到每个CPU
中,最大限度使用CPU
性能。
多个goroutine
中,Go
语言使用channel
进行通信,程序可以将需要并发设计的环节设计为生产者模式和消费者模式,将数据放入通道,通道另外一端的代码将这些数据进行并发计算并返回结果
使用Go语言开发的开源项目
Go语言开发的开源项目包括Docker
、Go-Ethereum
、Thrraform
和 Kubernetes
。
Docker
是一种操作系统层面的虚拟化技术,可以在操作系统和应用程序之间进行隔离,也可以称之为容器。Docker
可以在一台物理服务器上快速运行一个或多个实例。例如,启动一个CentOS操作系统,并在其内部命令行执行指令后结束,整个过程就像自己在操作系统一样高效。
Kubernetes
构建于Docker
之上的容器调度服务,用户可以通过Kubernetes
集群进行云端容器集群管理。
etcd
一款分布式、可靠的KV存储系统,可以快速进行云配置。
beego
是一个类似Python
的Tornado
框架,采用了RESTFul
的设计思路,使用Go
语言编写的一个极轻量级、高可伸缩性和高性能的 Web 应用框架。
martini
一款快速构建模块化Web 应用的 Web 框架。
codis
国产的优秀分布式 Redis
解决方案。
delve
Go
语言强大的调试器,被很多集成环境和编辑器整合。
Go语言的标准库强大
Go
语言的标准覆盖网络、系统、加密、编码、图形等各个方面,可以直接使用标准库的http
包进行HTTP
协议的收发处理。网络库基于高性能的操作系统通信模型(Linux
的epoll
/ Windows
的IOCP
)。所有的加密、编码都内建支持,不需要再从第三方开发者处获取。
Go
语言的编译器也是标准库的一部分,通过词法器扫描源码,使用语法树获得源码逻辑分支等。Go
语言的周边工具也是建立在这些标准库上,在标准库上几乎可以完成大部分的需求。Go
语言的标准库以包的方式支持,下表是Go
标准库中常见的包及其功能
Go语言标准库名 | 功能 |
---|---|
bufio | 带缓冲的I/O操作 |
bytes | 实现字节操作 |
container | 封装堆、列表和环形列表等容器 |
crypto | 加密算法 |
database | 数据库驱动和接口 |
debug | 各种调试文件格式访问及调试功能 |
encoding | 常见算法如JSON/XML/Base64等 |
flag | 命令行解析 |
fmt | 格式化操作 |
go | go语言的词法、语法树、类型等。可通过这个包进行代码信息提取和修改 |
html | HTML转义及模版系统 |
image | 常见图形格式的访问及生成 |
io | 实现I/O原始访问接口及访问封装 |
math | 数学库 |
net | 网络库,支持Socket、HTTP、邮件、RPC、SMTP等 |
os | 操作系统平台不依赖平台操作封装 |
path | 兼容各操作系统的路径操作实用函数 |
plugin | 支持将代码编译为插件,按需加载 |
reflect | 语言反射支持,可以动态获得代码中的类型信息,获取和修改变量的值 |
regexp | 正则表达式封装 |
runtime | 运行时接口 |
sort | 排序接口 |
strings | 字符串转换、解析及实用函数 |
time | 时间接口 |
text | 文本模版及Token词法器 |
Go语言上手简单
Go
语言是一种静态型、编译型并自带垃圾回收和并发的编程语言。
HTTP
文件服务器是常见的Web服务器之一,开发阶段为了测试,需要自行安装Apache
或Nginx
服务器,下载安装配置需要大量的时间,使用Go
语言实现简单的HTTP
服务器只需要几行代码
package main //标记当前文件为main包,main包是程序的入口包
import (
"net/http" //导入net/http包,这个包的作用是HTTP的基础访问和封装
)
func main() { //程序执行的入口函数main()
http.Handle("/", http.FileServer(http.Dir(".")))
//使用http.FileServer文件服务器将当前目录作为根目录处理
http.ListenAndServe(":8080", nil)
//默认的HTTP服务侦听在本机的8080端口
}