Golang语言调研

背景

随着越来越多大厂使用Golang(后面简称Go)语言,很多人不断从Java阵营转向Go阵地,到底它的魅力在哪里?和Java它有哪些优势?适合在哪些场景下使用?希望接下来的分享能从中找到答案

Go在Tiobe排行

2022年3月
在这里插入图片描述

  • Go最好成绩在2017年排名第10
  • 七牛云创始人兼CTO许式伟曾说过Go语言会取代Java

Go的来历

很久以前,有一个IT公司,这公司有个传统,允许员工拥有20%自由时间来开发实验性项目。在2007的某一天,公司的几个大牛,正在用c++开发一些比较繁琐但是核心的工作,主要包括庞大的分布式集群,大牛觉得很闹心,后来c++委员会来他们公司演讲,说c++将要添加大概35种新特性。这几个大牛的其中一个人,名为:Rob Pike,听后心中一万个xxx飘过,“c++特性还不够多吗?简化c++应该更有成就感吧”。
于是乎,Rob Pike和其他几个大牛讨论了一下,怎么解决这个问题,过了一会,Rob Pike说要不我们自己搞个语言吧,名字叫“go”,非常简短,容易拼写。其他几位大牛就说好啊,然后他们找了块白板,在上面写下希望能有哪些功能(详见文尾)。接下来的时间里,大牛们开心的讨论设计这门语言的特性,经过漫长的岁月,他们决定,以c语言为原型,以及借鉴其他语言的一些特性,来解放程序员,解放自己,然后在2009年,go语言诞生。
总结:c++语言在处理繁琐的核心工作上无法高效完成。以C为原型,借鉴其他语言的一些特性自研Go语言,来解放程序员,解放自己。

Go思想

Less can be more 大道至简

Go应运而生

  • 出身名门:Google
    • 官网:https://golang.google.cn/
    • 诞生于2006年1月2日下午15点4分5秒,于2009年11月开源,2012年发布go稳定版。
    • 最新版本1.182022.03.15
  • 语言优势
    • 为并发而生,单机性能高
      • 协程实现
        • 协程在用户态处理,不会像线程一样切换需要内核态进行处理
      • 协程以用户线程为宿主,单个协程4kb,可轻松支持百万协程
      • 协程概念 https://zhuanlan.zhihu.com/p/169426477
    • 简单易学,开发效率高
      • 运行速度接近C,并发性能接近Nginx,编码效率接近PHP(https://blog.csdn.net/ronon77/article/details/84716629)
      • 被称为“互联网时代的C语言”
var a int = 0
for i := 0; i < 20; i++ {
    fmt.Println("hello",i)
}

在这里插入图片描述

  • 主要特性
    • 1.自动垃圾回收
      • go 1.3 之前使用标记清除

      • go 1.5 三色标记法

      • go 1.8 三色标记法 + 混合写屏障机制

      • 三色标记

        • 主要流程:
        1. 首先将对象用三种颜色表示,分别是白色、灰色和黑色。最开始所有对象都是白色的,然后把其中全局变量和函数栈里的对象置为灰色。
        2. 第二步把灰色的对象全部置为黑色,然后把原先灰色对象指向的变量都置为灰色,以此类推。
        3. 等发现没有对象可以被置为灰色时,所有的白色变量就一定是需要被清理的垃圾了。通过write-barrier(写屏障)检测对象变化
          没办法放gif图在这里插入图片描述
        • https://www.cnblogs.com/hezhixiong/p/9577199.html
        • https://blog.csdn.net/zhghost/article/details/104120759
        • https://segmentfault.com/a/1190000012597428
        • https://www.cnblogs.com/peteremperor/p/13692129.html
    • 2.并发编程
      • goroutine虚拟线程(协程又叫轻量级用户线程),用户态处理。单个goroutine 4kb左右,可以很轻松创建数百万个。启动比线程快,一个关键字go启动协程

        • 一个Go程需要4k
          内存4k * 80,000 = 320,000k ≈ 0.3G
          内存4k * 1,000,000 = 4,000,000k ≈ 4G
          内存(注意4k这是需要连续地址的内存块)
          据我所知,在32位处理器上,Go程的数量上限就是80000左右
          但是在64位处理器上,基本不受限制,在我的机器上8G,可以创建100万Go程。
          https://www.zhihu.com/question/48507569

      • GMP 模型(v1.5)

        • M:machine的缩写,一个M代表一个内核线程,或者称之为“工作线程”

        • P:processor的缩写。一个P代表执行一个GO代码片段所必须的资源(或称之为“上下文环境”),即用户级线程

        • G:goroutine的缩写(即协程)。一个G代表一个GO代码片段。前者是对后者的一种封装。
          在这里插入图片描述

        • go func () 调度流程
          在这里插入图片描述

        • 调度器生命周期

          • Go 调度本质是把大量的 goroutine 分配到少量线程上去执行,并利用多核并行,实现更强大的并发
            在这里插入图片描述
      • 搭配 channel通道。goroutine 奉行通过通信来共享内存,而不是共享内存来通信。

      • 参考资料
        https://blog.csdn.net/qq_15054345/article/details/89964800?utm_source=app&app_version=5.3.0&code=app_1562916241&uLinkId=usr1mkqgl919blen
        https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/GMP%E5%8E%9F%E7%90%86%E4%B8%8E%E8%B0%83%E5%BA%A6.html

    • 3.更丰富的内置类型
      值类型:
bool
int(32 or 64), int8, int16, int32, int64
uint(32 or 64), uint8(byte), uint16, uint32, uint64
float32, float64
string
complex64, complex128  --复数
array    -- 数组

引用类型:(指针类型)
slice   -- 可变的数组(最常用) , 也叫切片
map     -- 映射
chan    -- 管道

https://studygolang.com/articles/18255
https://www.topgoer.com/go%E5%9F%BA%E7%A1%80/%E5%9F%BA%E6%9C%AC%E7%B1%BB%E5%9E%8B.html

  • 4.函数多返回值
func getTeacher()(name string ,age int ,address string)  {
    name = "仓老师"
    age = 18
    address = "东京市"
    return
}

https://www.cnblogs.com/tobeymarshall/p/11950854.html

  • 5.错误处理
func Sqrt(f float64) (float64, error) {
   if f < 0 {
       return 0, errors.New("math: square root of negative number")
   }
}
  • 6.反射
  • 7.匿名函数和闭包
  • 8.类型和接口
  • 9.语言交互性
    • 可以和C混合使用
  • 适合做什么?
    • 服务端开发
    • 分布式系统,微服务
    • 网络编程
    • 区块链开发
    • 内存KV数据库,例如boltDB、levelDB
    • 云平台

目前在用公司

  • Google 创造Go,k8s,docker
  • Facebook 开源 https://github.com/facebookgo
  • 七牛云 国内第一家用Go(2011年),存储服务端主体语言
  • 字节 飞书,社交
  • 百度 前端流量接入,百度消息通讯
  • 腾讯(k8s持续集成)
  • 京东 消息推送,云存储
  • 360 日志搜索系统 https://github.com/Qihoo360/poseidon
  • 阿里
  • 滴滴
  • 美团
  • 小米
  • 新浪

和Java对比

对比\语言javago
适合领域非常广,企业级分布式应用平台/大数据/安卓/GUI等…消息推送、监控、容器、爬虫和网络高并发场景等…
入门难度适中简单
运行速度
占用内存
语法简洁适中极简
实现高并发难易一般容易
分布式场景方案完善基本完善
版本迭代速度6个月左右6个月左右
垃圾回收
从业人数极多较少
网上资料满天飞适中

总结

  1. Go语言语法的简洁能高效的工作
  2. Go语言生态发展很快
  3. Go在高并发和基础设施方向应用广泛
  4. Go和Java相比有优势也有不足,目前看各大厂对Go未来很看好

最后

你认为Go未来会取代Java吗?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值