Golang的优势

部署简单

Golang的部署方式非常简单,并且有以下三种:

  • 可以直接编译成机器码

    • 即机器能直接识别的二进制文件
  • 不依赖其他库

    • 最终生成的可执行程序是一个静态的(可执行)的文本文件
  • 直接运行即可部署

静态类型语言

Golang是静态类型语言,静态语言的优势:

  • 可以检查出来隐藏的大多数问题

    • 通过编译器对静态代码检测就能知道哪里有问题,而与静态语言相对应的动态语言只能通过在代码执行的时候逐行去判断。

语言层面的并发

  • Golang是天生支持并发,从原始语法就支持并发(有些语言虽然也支持并发,但是是通过层层封装实现的)
  • 充分的利用多核,切换成本很低,尽量提高CPU的并发的利用率。

可以看一下一段GO语言并发操作的代码:

package main

import (
    "fmt"
    "time"
)

func goFunc(i int) {
    fmt.Println("goroutine", i, "...")  // 打印自己的序号
}

func main() {
    for i := 0; i < 10000; i++{
        go goFunc(i)  //开启一个并发协程 
    }
    
    time.Sleep(time.Second)
}

这段代码的意思就是一个for循环,循环1万次,通过第14行的一个GO的关键字开辟一个协程,这个协程可以执行一个函数,这个就是一个单独的“流程体(也称执行流程体)”。

总结代码作用是开启一万个并行操作,每个操作去执行goFunc(i) 函数。

不需要去考虑底层CPU并发,不需要去优化GO语言的调度的时间片,Go语言本身就实现好了。

运行代码:
image.png
可以看到成功创建了10000个协程。

强大的标准库

Go语言有比较强大的标准库支撑,如:

  • runtime系统调度机制

    • 进行垃圾回收
    • 进行调度的平均分配
    • 等其他的优化机制
  • 高效的GC垃圾回收

    • 从GO的1.8版本之后,GC添加了三色标记和混合写屏障
  • 其他丰富的标准库,包括:

    • 数据持久存储与交换

      • 如json、xml
    • 输入输出

      • 标准的输入输出、设备的输入输出等
    • 日期和时间
    • 数学公式
    • 压缩算法
    • 文本
    • 进程、线程、goroutine
    • debug
    • email
    • 底层库
    • 文件系统

      • 创建文件夹、删除文件夹、修改文件夹权限等文件操作
    • 测试环境以及测试工具
    • 同步机制

      • 如多线程锁机制、消费者模型、条件变量
    • 网络通信

      • socket,网络协议,RPC协议等等
    • 应用构建
    • 加密解密

所以GO语言的标准库满足了开发的绝大部分需求,除了少数需求可能第三方库比标准库更加好用。

简单易学

  • 仅仅有25个关键字
  • 语法简单

    • 有C语言简洁基因,内嵌C语法支持
  • 面向对象特征

    • 封装
    • 继承
    • 多态
  • 跨平台

“大厂”领军

很多大公司也在使用GO语言,大厂帮忙开路,因此很多问题或者框架大厂都帮忙搞定,所以作为个人开发者只需要学习使用就能快速入门。

使用Golang的大厂:

  • 国外

    • 谷歌

      • go语言的开创者,含金量不必多说
    • facebook

      • 在github上专门成立了开源组织facebookgo,拥有很多平滑升级项目,如grace等
  • 国内:

    • tencent(腾讯)

      • 15年做了docker的万台规模实践,如腾讯的蓝鲸平台
      • 本身腾讯是主C/C++的公司,转GO比较方便
    • 百度

      • 运维这块使用go比较多,例如BFE的项目,负责前端的流量接入
      • github也有一个叫做百度云盘go版本的一个开源项目
    • 京东

      • 京东云的消息推送系统,云存储,商城等,大部分都有使用到GO
    • 七牛

      • go语言云生原公司
    • B站

      • 后台源代码go语言

Go语言与其他语言的性能对比

使用求斐波那契数列的函数粗略的对比一下性能优劣。

ITNA1B_92C1BYY2Z@XDLN4F.png

Golang强项(适合用来做什么)

代表作:docker、kubernetes

云计算基础设施领域

代表项目:docker、kubernetes、etcd、consul(服务发现)、cloudflare CDN、七牛云存储等。

基础后端软件

代表项目:tidb(国内的一个数据库)、influxdb、cockroachdb等。

微服务

代表项目:go-kit、micro、monzo bank的python、bilibili开源框架。

互联网基础设施

代表项目:以太坊、hyperledger等。

Golang的不足

包管理不完善

golang的使用的第三方库大部分托管在在github上,所以很多库可能会频繁变动,导致项目稳定性降低。
希望有官方出来管理第三方库

无泛化类型(1.18已添加)

没有泛化类型就不能提高代码的复用性。

所有Exception都用Error来处理(比较有争议)

将异常全部改为Error来处理,比较极端,相比于另一个极端java语言,java使用try catch来捕获所有error

对C的降级处理

Go语言兼容C语言不像C++完全兼容,Go语言只是可以通过Cgo这个包,来调用C的代码,这个兼容不是无缝,没有做到将C降级到汇编(ASM)那么完美。

C语言可以写汇编,并且非常完美,而Go调用C是有缝隙的,很多硬件或者一些底层的序列化问题还是用C是最优的。


最后修改:2024 年 03 月 13 日
如果觉得我的文章对你有用,请随意赞赏