编程语言之Go
2014-01-04 22:08:35 阿炯

Go语言其实是Golanguage的简称,又称 Golang,是 Google 的 Rob Pike,Robert Griesemer 及 Ken Thompson 主导开发的一种静态强类型、编译并发型语言。其语法与 C 语言相近,但功能上有:内存安全,GC(垃圾回收),结构形态及 CSP-style 并发计算。吉祥物为金花鼠(gordon)。


Go是Google开发的一种编译型,支持并发处理并具有垃圾回收功能且跨平台运行的编程语言,采用BSD协议授权。Go是一种静态、强类型、编译型、并发型,并具有垃圾回收功能的类C编程语言。2009年以开源项目的形式发布,2012年发布1.0稳定版本。


罗伯特·格瑞史莫(Robert Griesemer),罗勃·派克(Rob Pike)及肯·汤普逊(Ken Tompson)于2007年9月开始设计Go语言,稍后Ian Lance Taylor, Russ Cox加入项目中。Go语言是基于Inferno操作系统所开发的,于2009年11月正式宣布推出,成为开放源代码项目,并在Linux及Mac OS X平台上进行了实现,后追加Windows系统下的实现。

Go语言的语法接近C语言,但是对于变量的声明是不同的,其他语法不同之处是For循环和if判断式没有括号围绕。Go语言支持垃圾回收功能。Go语言的并行模型是以东尼·霍尔的CSP为基础,采取类似模型的其他语言包括occam和Limbo,但它也具有Pi运算的特征,比如通道传输。与C++相比,Go语言并不包括如异常处理、继承、泛型、断言、虚函数等功能,但增加了切片(Slice)型、并发、管道、垃圾回收、接口(interface)等特性的语言级支持。当然Google对于泛型的态度还是很开放的(已经于1.18版本中正式引入 ),但在该语言的常见问题列表中,对于断言的存在,则持负面态度,同时也为自己不提供类型继承来辩护。不同于Java,Go语言内嵌了关联数组(也称为哈希表(hashes)或字典(dictionaries)),就像字符串类型一样。

Go语言之父Pike提到:Go语言是以C为原型,以C++为目标而设计的;因为他觉得C++太复杂了,要解救程序员于水火;虽然Go以C++为目标而设计,但尴尬的是,Pike坦承Go并没有吸引来多少C++程序员,反而是吸引了不少Python、Ruby程序员。

核心设计师Pike和Ken都是出身自贝尔实验室,Ken之于Pike,亦师亦友,共同发明了UTF-8。Pike是Unix先驱,贝尔实验室最早跟Ken、Dennis一起开发Unix的,Plan9 OS的灵魂人物。大胡子Ken则是Unix之父,和Dennis一起发明了C语言,殿堂级程序员,早已是名满天下。技术实力毋容置疑,自己也都坦诚C用得最多最熟,所以注定了Go的类C特性,不过这会不会导致Go在语言上对OOP以及现代编程思想的支持不足,亦未可知。设计这门语言的设计者有以下几位:
Ken Thompson:在贝尔实验室与Dennis M. Ritche发明了C语言和Unix操作系统,与Rob Pike发明了UTF-8编码,图灵奖得主。
Rob Pike:也参与开发了Unix操作系统,UTF-8编码发明者之一。
Robert Griesemer:参与过V8 JavaScript引擎和Java HotSpot虚拟机的研发。

Go信奉的哲学:Less Is More,大道至简。

Go是介于C与C++之间的语言,比C抽象层次高,比C++抽象层次低。因为是一门新的编程语言,站在巨人的肩膀,博采众长,规避了一些已知的问题,添加了一些优秀的特征。

语言特色:简洁、快速、安全、并行、有趣、开源、内存管理、数组安全、编译迅速。

语言用途:其被设计成一门应用于搭载 Web 服务器,存储集群或类似用途的巨型中央服务器的系统编程语言。对于高性能分布式系统领域而言,Go 语言无疑比大多数其它语言有着更高的开发效率,它提供了海量并行的支持。

C/C++语言的问题:开发效率低,对开发者要求高;libc只向后兼容,运维难度偏大。

Lua/Perl/Python语言的问题:动态语言,缺少编译过程,低级错误频出;缺少有效的性能分析及调试工具。

七牛CEO许式伟谈到:编程哲学的重塑是 Go 语言独树一帜的根本原因,其它语言仍难以摆脱 OOP 或函数式编程的烙印,只有 Go 完全放弃了这些,对编程范式重新思考,对热门的面向对象编程提供极度简约但却完备的支持。它是互联网时代的C语言。

下载地址:https://go.dev/dl/

特色
没有继承多态的面向对象与异常处理(Error is value)
强一致类型,类型安全和内存安全
interface不需要显式声明(Duck Typing)
基于首字母的可访问特性
不用的import或者变量引起编译错误
完整而卓越的标准库包
Go内置runtime,高效的垃圾回收机制作用是性能监控、垃圾回收等
以非常直观和极低代价的方案实现高并发
快速编译同时解决 C 语言中头文件太多的问题
为多核计算机提供性能提升的方案
UTF-8 编码支持

应用
服务器编程:处理日志、数据打包、文件系统等
分布式系统:数据库处理器,中间件等
网络编程:目前使用最多最广泛的一块,Web 应用、API 应用等
云平台:目前云平台逐步采用 Go 实现

常用命令
go get:获取远程包需要提前安装 git 或 hg
go run:直接运行程序
go build:项目发布
go fmt:格式化源码部分 IDE 在保存时自动调用
go install:编译包文件并编译整个程序
go test:运行测试文件
go doc:查看文档
go help:查看 go 命令行


Go语言天生支持并发。其基因里面支持的并发,可以充分的利用计算机多核的条件,很容易实现高并发。开发效率和运行效率二者的完美融合,天生的并发编程支持;支持当前所有的编程范式,包括过程式编程、面向对象编程以及函数式编程。天生为高并发而生,goroutine 和 channel 使得编写高并发的服务端软件变得相当容易,很多情况下完全不需要考虑锁机制以及由此带来的各种问题。Golang是一门高性能的编程语言,可以与C++等传统编程语言相媲美。Golang运行时的性能比其他动态语言更高,这使得它非常适合进行大规模并发编程。其还提供了高效的垃圾回收机制和快速调度器,能够有效地节省CPU和内存资源的使用,安全指针和内建协程等从而使Golang应用程序的性能变得更加出色。还支持多线程编程,这使得程序员能够更加轻松地处理并发和多任务。

Go项目部署及其方便!其编译生成的是一个静态可执行文件,除了glibc外没有其他外部依赖。这让部署变得异常简单!目标及其上只需要一个基础的系统和必要的管理、监控工具,完全不需要操心应用所需的各种包、库的依赖关系,大大减轻了维护的负担。互联网应用、系统编程和网络编程。可在Windows、Linux、Mac等多个操作系统上进行开发。同时还支持多种CPU架构,包括x86、ARM、PowerPC等,不但可以扩展到嵌入式设备上,还可以在云端等各种场景下运行。这使得Golang非常适合大型分布式系统的开发,并且可以轻松地与其他编程语言进行交互。其生态圈拥有着丰富的库支持,包括数据库、网络、加密、XML、JSON等多种功能的库。这些库的出现大大降低了Golang程序开发的难度,其稳定性和性能也更加卓越。

Go语言的设计是非常优秀的,规范足够简单灵活。包含了类C语法、GC内置和工程工具。Go自带完善的工具链,大大提高了团队协作的一致性。比如gofmt自动排版Go代码,很大程度上杜绝了不同人写的代码排版风格不一致的问题。Go拥有强大的编译检查、严格的编码规范和完整的软件生命周期工具,具有很强的稳定性,稳定压倒一切。那么为什么Go相比于其他程序会更稳定呢?这是因为Go提供了软件生命周期的各个环节的工具,如go tool、gofmt、go test。其拥有众多的第三方库和工具,这些库和工具涵盖了各种不同的领域,包括网络编程、数据库连接、测试等等。与此同时,Go语言也建立了自己的包管理系统(go get)和模块管理工具(go mod),使得开发者能够快速获取和使用这些第三方库,大大提高了开发效率。

它这么火是有原因的:1、具备良好的性能;2、拥有简单而直观的语法;3、具备良好的工具生态系统;4、由于其跨平台的特性。

云计算时代的 C 语言(本节转自极客江南的博客空间,感谢原作者)

Go 语言被称为云计算时代的 C 语言,它在软件开发效率和运行效率之间做出了绝佳的权衡。这使得它既适应于互联网应用的极速开发,又能在高并发、高性能的开发场景中如鱼得水。正因如此,许多互联网公司,尤其是云计算领域的创业公司都选择 Go 语言作为其技术栈的重要组成部分。

源文件对比

  • C语言源文件
文件扩展名源类型
.h头文件,存放代码声明
.cC语言源文件,存放代码实现
  • Go语言源文件
文件扩展名源类型
.goGo语言源文件,存放代码实现

代码管理对比

  • C语言中通过文件来管理代码
    • 想使用某一个函数时,只需要include导入对应的.h文件即可
  • Go语言中通过包来管理代码
    • Go语言没有.h文件的概念, 在Go中想使用某一个函数时, 只需要import导入对应的包即可
  • C语言中函数、变量公私有管理
    • 通过extern和static实现是否公开函数和变量
  • Go语言中函数、变量公私有管理
    • 通过函数名称首字母大小写实现是否公开函数
    • 通过变量名称首字母大小写实现是否公开变量

关键字对比

  • C语言中一共有32个关键字
12345678
ifelseswitchcasedefaultbreakreturngoto
dowhileforcontinuetypedefstructenumunion
charshortintlongfloatdoublevoidsizeof
signedunsignedconstautoregisterstaticexternvolatile
  • Go语言中一共有25个关键字
12345678
ifelseswitchcasedefaultbreakreturngoto
fallthroughforcontinuetypestructvarconstmap
funcinterfacerangeimportpackagedefergoselect
chan       

数据类型对比

  • C语言数据类型

  • Go语言数据类型

  • C语言各数据类型占用内存空间
类型32位编译器64位编译器
char11
int44
float44
double88
short22
long48
long long88
void*48
  • Go语言各数据类型占用内存空间
类型32位编译器64位编译器本质
int8/uint811signed char/unsigned char
int16/uint1622signed short/unsigned short
int32/uint3244signed int/unsigned int
int64/uint6488signed long long int/unsigned long long int
byte11uint8/unsigned char
rune44int32/signed int
int48根据机器位数决定长度
uintptr48根据机器位数决定长度 uint32/uint64
float3244float
float6488double
true11char类型的整型
false11char类型的整型
  • 和C语言一样,Go语言也提供了Sizeof计算变量的内存空间
    • 1.导入import "unsafe"包
    • 2.通过unsafe.Sizeof()计算变量内存空间
//第8行到35行
typedef	signed char		int8;
typedef	unsigned char		uint8;
typedef	signed short		int16;
typedef	unsigned short		uint16;
typedef	signed int		int32;
typedef	unsigned int		uint32;
typedef	signed long long int	int64;
typedef	unsigned long long int	uint64;
typedef	float			float32;
typedef	double			float64;

#ifdef _64BIT
typedef	uint64		uintptr;
typedef	int64		intptr;
typedef	int64		intgo; // Go's int
typedef	uint64		uintgo; // Go's uint
#else
typedef	uint32		uintptr;
typedef	int32		intptr;
typedef	int32		intgo; // Go's int
typedef	uint32		uintgo; // Go's uint
#endif

#ifdef _64BITREG
typedef	uint64		uintreg;
#else
typedef	uint32		uintreg;
#endif

//第153行到157行
enum{
	true	= 1,
	false	= 0,
};


Go本质就是用C语言编写的一门高级编程语言。

常量变量对比

  • C语言定义常量和变量格式
数据类型 变量名称 = 值;
const 数据类型 常量名称 = 值;
  • Go语言定义常量和变量格式
    • 除了以下标准格式外,Go语言还提供了好几种简单的语法糖
var 变量名称 数据类型 = 值;
const 变量名称 数据类型 = 值;

注释对比

  • 和C语言一样,Go语言也支持单行注释和多行注释, 并且所有注释的特性都和C语言一样
    • 单行注释 // 被注释内容
    • 多行注释 /* 被注释内容*/
  • 在Go语言中,官方更加推荐使用单行注释,而非多行注释(详情可以直接查看Go官方源码)

运算符对比

  • 算数运算符和C语言几乎一样
    • Go语言中++、–运算符不支持前置
      • 错误写法: ++i; --i;
    • Go语言中++、--是语句不是表达式,所以必须独占一行
      • 错误写法: a = i++; return i++;
运算符描述实例
+相加A + B
-相减A - B
*相乘A * B
/相除B / A
%求余B % A
++自增A++
自减A–
  • 关系算符和C语言一样
运算符描述实例
==检查两个值是否相等,如果相等返回 True 否则返回 False。A == B
!=检查两个值是否不相等,如果不相等返回 True 否则返回 False。A != B
>检查左边值是否大于右边值,如果是返回 True 否则返回 False。A > B
<检查左边值是否小于右边值,如果是返回 True 否则返回 False。A < B
>=检查左边值是否大于等于右边值,如果是返回 True 否则返回 False。A >= B
<=检查左边值是否小于等于右边值,如果是返回 True 否则返回 False。A <= B
  • 逻辑运算符和C语言一样
运算符描述实例
&&如果两边的操作数都是 True,则条件 True,否则为 False。A && B
\|\|如果两边的操作数有一个 True,则条件 True,否则为 False。A || B
!如果条件为 True,则逻辑 NOT 条件 False,否则为 True。!A
  • 位运算符和C语言几乎一样
    • 新增一个&^运算符
运算符描述实例
&参与运算的两数各对应的二进位相与, 对应位只要都是1结果就为1A & B
\|参与运算的两数各对应的二进位相或,对应位只要其中一个是1结果就为1A | B
^参与运算的两数各对应的二进位相异或,对应位只要不同结果就是1A ^ B
<<左移运算符,左移n位就是乘以2的n次方A << 2
>>右移运算符,右移n位就是除以2的n次方B >> 2
&^逻辑清零运算符, B对应位是1,A对应位清零,B对应位是0, A对应位保留原样A &^ B
int main(){
	/*
	  0110      a
	&^1011      b 如果b位位1,那么结果为0, 否则结果为a位对应的值
	----------
	  0100
	*/
	a1 := 6
	b1 := 11
	res1 := a1 &^ b1
	fmt.Println("res1 = ", res1) // 4

	/*
	  1011      a
	&^1101      b 如果b位位1,那么结果为0, 否则结果为a位对应的值
	----------
	  0010
	*/
	a2 := 11
	b2 := 13
	res2 := a2 &^ b2
	fmt.Println("res2 = ", res2) // 2
}
  • 赋值运算符和C语言几乎一样
    • 新增一个&^=运算符
运算符描述实例
=将右边赋值给左边C = A + B 将 A + B 表达式结果赋值给 C
+=相加后再赋值C += A 等于 C = C + A
-=相减后再赋值C -= A 等于 C = C - A
*=相乘后再赋值C *= A 等于 C = C * A
/=相除后再赋值C /= A 等于 C = C / A
%=求余后再赋值C %= A 等于 C = C % A
<<=左移赋值C <<= 2 等于 C = C << 2
>>=右移赋值C >>= 2 等于 C = C >> 2
&=位逻辑与赋值C &= 2 等于 C = C & 2
^=位逻辑或赋值C ^= 2 等于 C = C ^ 2
\|=位逻辑异或赋值C |= 2 等于 C = C | 2
&^=位逻辑清零赋值C &^= 2 等于 C = C &^ 2

流程控制语句对比

  • C语言流程控制中的if、switch、for在Go语言都可以使用
  • C语言中的四大跳转语句return、break、continue、goto在Go语言都可以使用
  • Go语言除了实现C语言中if、switch、for、return、break、continue、goto的基本功能以外,还对if、switch、for、break、continue进行了增强
    • 例如: if 条件表达式前面可以添加初始化表达式
    • 例如: break、continue可以指定标签
    • 例如: switch语句可以当做if/elseif来使用
    • … …
  • 值得注意的是Go语言中没有while循环和do..while循环, 因为它们能做的Go语言中的for循环都可以做

函数和方法对比

  • C语言定义函数格式
返回值类型 函数名称(形参列表){
        函数体相关语句;
        return 返回值;
}
  • Go语言定义函数格式
func  函数名称(形参列表)(返回值列表){
        函数体相关语句;
        return 返回值;
}
  • C语言中没有方法的概念, 但是Go语言中有方法
    • 对于初学者而言,可以简单的把方法理解为一种特殊的函数
func  (接收者 接受者类型)函数名称(形参列表)(返回值列表){
        函数体相关语句;
        return 返回值;
}

其它新增特性

  • 接口
  • 并发
  • 反射
  • 异常处理

Go 与 C 的比较学习

关键字
分类CGo
字符char
字符串string
浮点数double , floatfloat32 , float64 , complex64 , complex128
整数int long shortuint8 , uint16 , uint32 , uint64 , int8 , int16 , int32 , int64 , uint , int , uintptr , byte = uint8 , rune=unit32
boolboolean true , false
函数func
接口interface
void
Anyinterface{}
聚合enum , struct , unionstruct
符号限定符号signed , unsigned , auto , const , extern , register , static , volatileauto , const
流程控制break , case , do , for , goto , if , else , continue , default , return , switch , whilefor , if , else , goto , break , switch , case , default , fallthrough , range , select , range
数据结构map
其他sizeof , typedefiota , var , type , defer , go chan , package , import


操作符
功能CGo
取反~^
选择? : 
取指针内容-> 
写入读出 <- ->
初始化并赋值 :=

其余的运算符基本相同。

变量
XCGo
声明/定义TYPE NAME int i(var) NAME TYPE var i int
字符(串)char , char []byte byte[], string
整形位宽依赖于特定的平台和编译器可以指定宽度, 也可以依赖平台编译器
有效范围栈上开辟的变量在作用域内有效, 堆上开辟的变量手动释放之前有效最后一个引用离开作用域之前都有效
作用域控制static 限制于本文件有效,extern 寻找其他文件的全局变量大写开头可以导出, 小写仅限本包使用


指针
假设a是一个指向某结构体的指针,这个结构体中有个成员叫b。
CGo
a->ba.b


取指针& 运算符 和解指针 * 运算符是一样的。
在指针比较中, Go 中的 nil 等效C语言的 NULL。

函数
返回值
CGo
只能有一个可以有多个

闭包
CGo

C 语言的函数和变量是两个不同的概念,变量仅可以通过函数指针的形式来标识一个函数。
Go 语言的函数也是一种变量。

控制流程
XCGo
if“if ( condition) XXX else XXX“`“`if condition {XXX} else {XXX}
switch只能选择可以转化为整形的 , case中没有break自动继续可以任意类型, 不会自动继续, 除非使用failthrough
select是个函数关键字, 选择chan
forfor ( ; ; ) XXXfor ; ; {XXX}
while
do … while


编程规范
句末不需要分号
if for 的代码段必须被大括号包围
if 的 condition 不要括号
for 的 指示部分不要括号
左花括号不能自成一行

并发
XC/C++Go
实现依赖系统接口的线程go 关键字, goroutine协程
依赖系统提供或者库或者自己实现sync包
通讯共享内存/消息消息 chan机制


项目管理
XC/C++Go
编译器自行挑选自带
工程管理自行挑选自带
测试机制自行挑选自带
统一编码格式依赖程序员自觉工具统一整理


Go语言相对于C/C++的优势

1、学习曲线容易
语法简单,包含了类C语法。因为Go语言容易学习,所以一个大学生花几个星期就能写出来可以上手的、高性能的应用。在国内大家都追求快,这也是为什么国内Go流行的原因之一。

2、效率:快速的编译时间,开发效率和运行效率高
开发过程中相较于 Java 和 C++呆滞的编译速度,Go 的快速编译时间是一个主要的效率优势。Go拥有接近C的运行效率和接近PHP的开发效率。C 语言的理念是信任程序员,保持语言的小巧,不屏蔽底层且底层友好,关注语言的执行效率和性能。

3、自由高效:组合的思想、无侵入式的接口
开发效率和运行效率二者的完美融合,天生的并发编程支持。Go语言支持当前所有的编程范式,包括过程式编程、面向对象编程、面向接口编程、函数式编程。程序员们可以各取所需、自由组合。

4、强大的标准库
这包括互联网应用、系统编程和网络编程。Go里面的标准库基本上已经是非常稳定了,特别是网络层、系统层的库非常实用。Go 语言的 lib 库麻雀虽小五脏俱全,基本上有绝大多数常用的库。

5、部署方便:二进制文件,直接部署
这一点是很多人选择Go的最大理由,因为部署太方便了,所以现在也有很多人用Go开发运维程序。

6、简单的并发
并行和异步编程几乎无痛点。Go 语言的 Goroutine 和 Channel 这两个神器简直就是并发和异步编程的巨大福音。像 C、C++、Java、Python 和 JavaScript 这些语言的并发和异步方式太控制就比较复杂了,而且容易出错,而 Go 解决这个问题非常地优雅和流畅。这对于编程多年受尽并发和异步折磨的编程者来说,完全就是让人眼前一亮的感觉。Go 是一种非常高效的语言,高度支持并发性,是为大数据、微服务、并发而生的一种编程语言。

Go 作为一门语言致力于使事情简单化。它并未引入很多新概念,而是聚焦于打造一门简单的语言,它使用起来异常快速并且简单。其唯一的创新之处是 goroutines 和通道,Goroutines 是 Go 面向线程的轻量级方法,而通道是 goroutines 之间通信的优先方式。创建 goroutines 的成本很低,只需几千个字节的额外内存,正由于此,才使得同时运行数百个甚至数千个 goroutines 成为可能。可以借助通道实现 goroutines 之间的通信。Goroutines 以及基于通道的并发性方法使其非常容易使用所有可用的 CPU 内核,并处理并发的 IO。相较于 Python/Java,在一个 goroutine 上运行一个函数需要最小的代码。

7、稳定性
Go拥有强大的编译检查、严格的编码规范和完整的软件生命周期工具,具有很强的稳定性,稳定压倒一切。那么为什么Go相比于其他程序会更稳定呢?这是因为Go提供了软件生命周期(开发、测试、部署、维护等等)的各个环节的工具,如go tool、gofmt、go test。

后附上一张简单的对比图(转自互联网,感谢原作者)


研发效率


工程化



Go与C语法详细对比详见此处。Go的性能与C比较:略逊一筹,不过做应用系统和中间件系统是足够了,之所以说比不上,是因为在Go运行时系统为管理并发程序做了很多工作,这些是需要消耗一定资源的;但带来的好处是巨大的,比如:简单但强大的并发编程方法、内存自动管理,以及对各种主流性能检测工具和调试工具的支持等。对于新手程序员来说,使用Go能达到有经验的C程序员能达到的程度,换句话说Go把这个门槛降低了!C 如果优化的透彻,用它写东西的人是高手,Go 语言这种带 GC 的语言的性能不可能超越 C。资深CPP程序员经验之谈,凡是Go和C都适合的场景,优先选择Go,性能不是唯一考量,开发体验,开发效率也是重要因素。

编程语言是计算机编程的基础。一门可靠的编程语言可以简单明了地表达出计算机所需的指令,让程序员能够更加轻松、高效地编写程序。对于程序员和企业来说,选择一门好的编程语言非常重要,它决定了项目的开发效率、软件质量以及最终产品的实用性等多个方面,Golang的出现降低了开发难度和复杂度,大大提高了程序员的开发效率。其高效快速、跨平台、高性能、丰富的库支持以及开发效率等优点,使它成为了最流行的编程语言之一。未来Golang将继续发展,成为更多企业和开发者的首选语言。来看一下它适合开发什么软件:1、构建高性能的网络服务软件;2、构建云原生应用软件;3、构建跨平台的桌面应用软件;4、构建区块链应用软件;5、构建系统级应用软件。

与其他编程语言相比,Go语言具有许多独特的特点,使得它在各种软件开发方面都有广泛的应用。

1、适合构建高性能的网络服务。其设计目标之一是高并发和低延迟。它使用Goroutines(轻量级的线程)和通道(channel)来实现并发编程,使得开发者能够轻松地编写高效的并发代码。这对于需要处理大量请求的网络服务非常重要。许多知名的网络服务,如Docker、Kubernetes和etcd,都是使用Go构建的。

2、适合构建云原生应用。随着云计算的快速发展,云原生应用的需求也日益增加。云原生应用是指使用容器和微服务架构来构建应用程序的方式。Go语言具有轻量级的协程和速度快的编译器,使得它成为构建云原生应用的理想选择。Kubernetes就是一个运行在云环境中的容器编排平台,它的核心组件都是使用Go编写的。

3、适合构建跨平台的桌面应用。Go语言的编译器可以将Go代码编译成可执行文件,省去了对特定操作系统的依赖。这意味着你可以使用Go编写一次代码,然后编译成Windows、macOS或Linux上的可执行文件。因此Go非常适合构建跨平台的桌面应用。

4、适合构建区块链应用。区块链是一种去中心化的分布式数据库,具有高度的可信性和安全性。Go语言的简洁和高效使得它成为构建区块链应用的理想语言。例如,以太坊(Ethereum)是一种基于区块链技术的智能合约平台,它的底层虚拟机(EVM)就是使用Go编写的。

5、适合构建系统级应用。系统级应用是指与操作系统紧密相关的应用程序,如操作系统、驱动程序和网络协议栈。Go语言的原生支持并发和系统级编程,使得它在构建系统级应用方面非常强大。例如,Docker的底层容器运行时runc就是使用Go编写的。

总的来说,Go语言具有高性能、高并发和简洁的特性,适合构建各种软件。它在网络服务、云原生应用、桌面应用、区块链应用和系统级应用方面都有广泛的应用。随着Go的不断发展和完善,相信它将在更多的领域发挥其优势。

Go 的主要使用场景

主要场景有很多,比如网络编程,包括 Web 系统、API 应用、下载应用、游戏后端,以及各种服务器编程,例如处理日志、数据打包、虚拟机处理、文件系统,等等。相关的项目在 GitHub 上十分多。除了这些,Go 还适合分布式系统、网关类系统(微服务网关)、数据库代理器、基础服务等的开发,只要有高并发高可用需求的服务端程序都可以用 Go 开发。

内存数据库,谷歌开发的 groupcache,couchbase 的部分组建。云平台,目前国外很多云平台采用 Go 开发,CloudFoundy 的部分组建。另外 IoT 方面有 Gobot 框架,移动开发方面也有官方的解决方案(虽然还有待进一步发展)。

Go 在大数据领域的应用,以及在大数据领域的应用(海量存储,批处理,流处理,数据预测等方面)有哪些比较看好的开源或商业项目吗?

在数据挖掘(尤其是爬虫)、数据分析、数据存储方面,Go 都非常适合。在 GitHub 上边有很多这方面的库,尤其是挖掘和存储方面(国产的有很多,比如:pholcus(爬虫)、TiDB(存储)等等)。

海量存储有很多,比如 InfuxDB、CockroachDB、TiDB。其他方面在 GitHub 上也有很多开源项目,不一一列举了。不过商业的项目目前并不多见。

在大数据领域,Go 和 Python 也是十分优秀的组合。

Go 作为系统编程语言意在取代 C/C++,请问有哪些系统编程使用场景?
谁也取代不了谁,谁也不会被轻易取代,只能说在新的时代更加适合做基础性的工作,“云计算时代的C语言”的意思是在云计算时代更适合做基础性的工作,实际情况也印证了这一点。我们可以用 Go 轻易编写系统级的基础命令,也可以用 Go 编写软件替代 C/C++ 软件,比如 Caddy 可以替代 Nginx 等等。

目前很多电商平台是用 PHP 开发的,Go 适合做电商平台的开发语言吗?
电商用 PHP 主要都是因为开发快,但是从节省运维成本和提高运行效率的角度讲,Go 也是很不错的选择。PHP 更容易做页面渲染,而 Go 更擅长做并发任务处理。在我司是这么划分的。PHP 在某些任务的开发效率上可能更高,但是程序运行效率是比不上 Go 的。

人工智能之类的有名的项目,目前没有是 Go 做的,如何用 Go 做人工智能?
Go 语言由于 Google 的推动进入 AI 领域是必然的。目前 Go 做人工智能相关的工作主要是搭 Tensorflow 的车,因为深度学习框架 Tensorflow 已经有 Go 的 API 了。相信 Go 会逐渐成为主要角色的。

创业公司都选择 Go 语言作为其技术栈合适吗?
现在有很多公司都这么做,不过一个技术型公司一般不会只选用一种语言作为基础技术栈的。推荐创业团队选用 Go 语言作为其基础技术栈(之一)。

Go 语言的优势

部署简单:Go 编译生成的是一个静态的可执行文件,除了 glibc 外没有其他外部依赖。这让部署变得异常方便;
并发性好:语言层面支持并发,这个是 Go 最大的特色。Goroutine 和 channel 使得编写高并发的服务端软件变得十分容易,很多情况下不需要考虑锁机制以及由此带来的各种问题;
良好的语言设计:从工程的角度看,Go 的规范简单灵活,自带完善的工具链,例如 gofmt 可自动排版代码;
执行性能好:适合编写瓶颈业务,非常节省内存;
丰富的标准库:内置了大量的库,还有强大的网络库。

Go 语言相比 Java、PHP 这类时下用得最广的语言在执行速度跟并发编程上优势很明显,除了这两点外,它还有别的优势吗?
工程化能力、开发和运行效率上的权衡是 Go 很突出的两个特色。这两方面初看没什么,但细究起来真正是为软件工程的实施准备的,能起到非常大的作用。当一个团队去做大项目工程的时候,优势还是很明显的。

Rust 没有 GC,Nim 有 GC 但编译成 C 性能更好,请问 Golang 在和 Rust、Nim 的竞争中会逐渐处于弱势吗?
看一门语言要看它的“干爹”、生态建设和发展历史。Nim的语法也很讨人喜欢,但是没有大公司支持,发展没有保障。Rust 也是一门很不错的语言,基本上是纯社区支持,但是学习门槛很高,生态也不是太万重山,需要观望。Go 非常适合技术团队使用。如果只是把玩的话 Nim 还是很不错的,如果想锻炼心智 Rust 也是一个很不错的选择。

相比于 Python、Perl、Ruby 等后端开发语言,Go 有哪些优势呢?
与脚本语言相比,Go 的优势很明显 — 性能好。当然,缺点就是语法糖太少,不过这也是 Go 的工程化理念的一种体现;其并发编程模型是非常独特的,它省去了开发者自己去处理复杂的并发处理场景。这一点非常值得广大开发者研习。

Go 语言支持多线程吗?
Go 在内核线程之上构建了用户级线程机制和模型,可以说 Go 的并发模型就是建立在内核线程之上的;它完美地包装了传统的多线程编程模型,并且有效屏蔽了多线程编程的复杂度。

优秀项目集

上面已经提到了那么多Golang的优秀之处,但以前出现过的很多语言也都是这么宣传的。语言的目标是用于项目开发,并能打造出很多优秀的产品。那么golang有哪些好像优秀的项目呢?列举一些收集到的由其开发的优秀项目:

docker,golang头号优秀项目,通过虚拟化技术实现的操作系统与应用的隔离,也称为容器;
kubernetes,由google开发,简称k8s,k8s和docker是当前容器化技术的重要基础设施;
etcd,一种可靠的分布式KV存储系统,有点类似于zookeeper,可用于快速的云配置;
codis,由国人开发提供的一套优秀的redis分布式解决方案;
tidb,国内PingCAP 团队开发的一个分布式SQL 数据库,国内很多互联网公司在使用;
influxdb,时序型DB,着力于高性能查询与存储时序型数据,常用于系统监控与金融领域;
cockroachdb,云原生分布式数据库,继NoSQL之后出现的新的概念,称为NewSQL数据库;
beego,国人开发的一款及其轻量级、高可伸缩性和高性能的web应用框架;
caddy,类比于nginx,一款开源的,支持HTTP/2的 Web 服务端;
flynn,一款开源的paas平台;
consul,HashiCorp公司推出的开源工具,用于实现分布式系统的服务发现与配置;
go-kit,Golang相关的微服务框架,这类框架还有go-micro、typthon;
go-ethereum,官方开发的以太坊协议实现;
couchbase,是一个非关系型数据库;
nsq,一款高性能、高可用消息队列系统,每天能处理数十亿条的消息;
packer,一款用来生成不同平台的镜像文件的工具,例如VM、vbox、AWS等;
doozer:高速的分布式数据同步服务,类似ZooKeeper;
tsuru:开源的PAAS平台,和SAE实现的功能一模一样;
gor:一款用Go语言实现的简单的http流量复制工具;

项目列举了这么多,从此也可看出现在很多新项目都在使用Golang开发,涉及到很多领域。

Go 语言在2020年的现状

JetBrains 官方博客发表了一篇题为"The state of Go"的文章,他们通过深入研究有关 Go 的信息,发现了不少鲜为人知的事实,并提供了翔实的数据作为支撑。此外,JetBrains 还邀请到了知名的 Go 语言专家 Florin Pățan 针对各项数据发表了自己的见解。

1、Go 开发者
数量与所处地区:全球大约有 110 万名职业 Go 开发者(特指在工作中专门将 Go 作为主力编程语言的群体),如果把主要使用其他编程语言但同时兼职使用 Go 的专业开发者计算在内,这个数字可能接近 270 万。从 Go 开发者在全球地区的分布来看,生活在亚洲的职业 Go 开发者最多,大约有 57 万。Go 语言专家 Florin 表示这在他的预期之内。他认为亚洲的 Go 开发者数量之所以高居榜首是因为那里有大量的开发者来自腾讯、阿里巴巴和华为等大型公司,这些公司一般都会雇佣许多开发者。

如果再细分下去,以国家为维度查看使用 Go 作为主力编程语言的开发者分布情况,中国所占的比例最高,有 16% 的中国开发者使用 Go 进行开发。Florin 对此同样不感到意外,不过他表示本以为俄罗斯会排第二,美国会进入前五,然而事实却是日本的 Go 开发者数量排名第二,美国排到了第七。谈及中国位居榜首的原因,他认为最重要的是中国拥有数量相当庞大的开发者,根据他自己所认识的公司来看,诸如 PingCAP、腾讯、和华为都拥有大量开发者帮助构建与微服务相结合的内部工具、基础设施和后端服务。Florin 提到了俄罗斯的 Go 社区非常活跃,Go 在那里也非常流行,不过他对 Go 开发者在日本和乌克兰的分布情况感到意外,因为他本以为德国和印度会更高,Florin 表示自己四五年前在柏林的时候,所认识的每家初创公司都使用了 Go。

2、使用 Go 开发的软件类型
根据 JetBrains 2020年开发者生态调查的结果,Web 服务是使用 Go 进行开发的最受欢迎的领域,所占份额为 36%;其次分别是实用程序、IT 基础设施、工具库和系统软软件开发。

3、使用 Go 的热门行业
其开发者主要从事 IT 服务行业,其次是金融和金融科技,云计算/平台、大数据、移动开发和其他行业。Go 也是十大主要编程语言之一,被专业开发者采用的所占比例为 7%。Florin 认为,许多人并不倾向于以 Go 作为其第一门学习的编程语言,通常是从其他语言(例如 PHP 和 Ruby)迁移过来,据他所知主要是从 C++ 和 C# 迁移到 Go。他还表示,Go 相对 PHP 的优势在于类型安全,因为 Go 是静态类型语言,而 PHP 是动态语言。这意味着编译器会帮助开发者完成大部分工作,以确保他们编写的代码能够正确编译和运行,并在运行时不会出现问题。Go 与 C++ 相比的优势是简单。在 Go 中,一切都非常简单。此外在不进行任何特殊优化的情况下,使用 Go 还会获得性能方面的提升,这对公司来说是重要的生产力优势。他还提到了 Go 采用率持续增长的另一个原因,由于许多流行的 IT 基础设施都是用 Go 编写,例如 Kubernetes、Docker 和 Vault,因此尽管许多公司的主力技术栈可能是 Java 或者其他语言,但他们也会配置针对 Go 的团队,尤其是在维护和修补此类基础设施项目方面。

Go 开发者 2021 调查报告

Go 遵循每 6 个月发布一个大版本的规律,新近发布的 1.20发布于 2023年1月,其每个版本围绕“语言特性”,“工具链”,“Runtime”,“Compiler”,“Linker”,“Library”这几个方面进行大量的迭代更新。

为什么需要了解版本迭代?
1.版本更新会引入新的语言特性和改进,可以让开发者更加高效地编写代码和解决问题。
2.版本更新可能会更改标准库、包和API的行为,需要开发者进行适应和更新。
3.了解版本更新可以帮助开发者更好地利用Go语言的性能和功能,提高代码的质量和效率。
4.版本更新通常会修复漏洞和错误,提高代码的安全性和可靠性。
5.Go语言社区和生态系统的发展也与版本更新密切相关,了解版本更新可以帮助开发者更好地了解Go语言的生态环境和未来发展方向。

另据TIOBE在2024年2月的编程语言调查排行:Go 首进前十,排名第八。


Go版本更新录(202x)


官方主页:http://golang.org/