专栏首页架构圈的那些事Golang横空出世的背景(为什么选择Go)

Golang横空出世的背景(为什么选择Go)

前言

起源及演进

最近十年来,C/C++在计算领域没有很好得到发展,并没有新的系统编程语言出现。对开发程度和系统效率在很多情况下不能兼得。要么执行效率高,但低效的开发和编译,如C++;要么执行低效,但拥有有效的编译,如.NET、Java;所以需要一种拥有较高效的执行速度、编译速度和开发速度的编程语言,Go就横空出世了。

go是一个Google公司推出的一个开源项目(系统开发语言),它是基于编译、垃圾收集和并发的编程语言。并将其开源并在BSD许可证下发行。

Go最初的设计由Robert Griesemer,Rob Pike 和Ken Thompson在2007年9月开始的,官方的发布是在2009年11月。2010年5月由Rob Pike公开的将其运用于google内部的一个后台系统。目前在google App Engine也支持go语言(目前仅支持三种:Java、Python和Go)

Go可以运行在Linux, Mac OS X, FreeBSD, OpenBSD, Plan 9 和 Microsof windows系统上,同时也支持多种处理器架构:I386, AMD64和ARM

(注:官方网站: http://golang.org

Robert Griesemer:曾协助制作Java的HotSpot编译器和Chrome浏览器的JavaScript引擎V8

Rob Pike:曾是贝尔实验室的Unix团队和Plan9操作系统计划成员,与Thompson工同创造了UTF-8字符编码

Ken Thompson:是C语言和Unix的创造者。(1983年图灵奖和1988国家技术奖)

他们对系统编程语言、操作系统和并发有很深的理解。

主要特点

  • Go被设计为21世纪的C语言,它属于C语言家族,比如:C/C++、Java和C#,同时它吸收了很多现在编程语言的优点。
    • 对Go的并发机制是源于CSP(Communication Sequential Processes),这同样的机制也被于Erlang。
    • 对C、C++相比,其语法得到了很大程序上的简化,使代码更简明、清楚,同时拥有动态语言的一些特点
  • 基于BSD完全开源,所以能免费的被任何人用于适合商业目的。
  • 语言层面对并发的支持(goroutine:独立于OS的线程,所以多个goroutine可以运行在一个OS的线程里,也可以分布到多个OS线程里。goroutine是从OS线程上抽象出来的一个轻量级的基于CSP的协程)
    • 在语言层面加入对并发的支持,而不是以库的形式提供
    • 更高层次的并发抽象,而不是直接暴露OS的并发机制.
    • 多个goroutine间是并行的。
    • 底层混合使用非阻塞IO和线程
  • 主要目的
    • 融合效率、速度和安全的强类型的静态编译语言,同时能够容易的进行编程,让编程变得更有乐趣。
    • 较少的关键字和简洁的语法
    • 类型安全和内存安全:在指针类型,但不允许对指针进行操作。
    • 支持网络通信、并发控制、并行计算和分布式计算。
    • 在语言层面实现对多处理器(或多核)进行编程
  • 内嵌运行时反射机制。
  • 可以集成C语言实现的库
  • 它不是传统意义上的面向对象语言(没有类的概念),但它有接口(interface),由此实现多态特性。
  • 函数(Function)是它的基本构成单元(也可以叫着面向函数的程序设计语言)
  • 是一种静态类型和安全的语言,将其编译、连接成本地代码(拥有高效的执行效率)
  • 支持交叉编译,并采用编译的编码:UTF-8

应用领域

它最初的构想是作为一个系统编程语言,但目前也被用于像Web Server,存储架构等这类分布式、高并发系统中。当然也可以用于一般的文字处理和作为脚本程序。

Go的编译器作为Native Client被内嵌到Chrome浏览器中,可以被Web应用程序用来执行本地代码;同时Go也可以运行在Intel和ARM的处理器上。

目前已被Google集成到Google APP Engine中,在基于Google App Engine基础设施的Web应用中也得到了很好的应用。目前GAE中仅支持三种应用程序开发语言:Java、Python和Go。(注:GAE的链接)

但不适合应用到对实时性要求很高的系统中,因为Go的内存模型是基于垃圾回收机制和原子内存分配。

目前缺少的一些特性

目前Go对OO中涉及到的一些特点还没有很好的支持,但可能会在以后进一步完善。

  • 没有函数和操作符的重载
  • 不支持隐式类型转换, 避免产生Bug和迷惑。
  • 不支持类和继承。
  • 不支持动态代码加载
  • 不支持动态库
  • 不支持泛型

总结

Go语言的主要特点

  • 强调简单、易学
  • 内存管理和语法简单
  • 快速编译
  • 并发支持
  • 静态类型
  • 部署简单(go install)
  • 自身就是文档(通过godoc将代码中的注释信息构造成文档)
  • 开源免费(BSD licensed)

本文分享自微信公众号 - 架构圈的那些事(wenpengsoft_design)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-09-28

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 【LeetCode杂烩】 Two Sum

    Given an array of integers, return indices of the two numbers such that they add...

    用户3894598
  • 你真的了解架构师这个工种吗?

    随便打开某招聘网站:系统架构师、搜索架构师、前端架构师、iOS/Android架构师、平台架构师、(大)数据架构师、JAVA/PHP/.NET架构师、高级架构师...

    用户3894598
  • 【极客世界】架构到底是指什么?

    对于技术人员来说,“架构”是一个再常见不过的词了。我们会对新员工培训整个系统的架构,参加架构设计评审,学习业界开源系统(例如,MySQL、Hadoop)的架构,...

    用户3894598
  • 漏洞|74cms 3.6 前台SQL注入+Python脚本小练习

    最近有个74cms v4.2.3任意文件下载的漏洞,本来想试着和74cms 3.6 前台SQL注入漏洞结合下然后取出QS_pwdhash的值进行MD5碰撞,可...

    漏斗社区
  • Dance In Heap(三):一些堆利用的方法(中)

    0x00 前面的话 在前一篇堆的利用方法里面,我们简单的提了一下UAF,并主要对从 bin 中释放 chunk 的操作,即 unlink 宏、unsortedb...

    FB客服
  • 【框架】122:spring框架之注解

    IoC容器是Spring的特色之一,可以使用它管理很多Bean,前几天我们都是将这些Bean配置在applicationContext.xml文件中的。

    刘小爱
  • 提高数据效率的社会和治理影响(Computers and Society)

    许多研究人员致力于提高机器学习的数据效率。如果他们成功了会发生什么?本文探讨了提高数据效率对社会经济的影响。具体来说,我们考察了这样一种直觉,即数据效率将削弱保...

    李欣颖6837176
  • 推荐系统中的常用算法——DeepWalk算法

    DeepWalk算法是在KDD2014中提出的算法,最初应用在图表示(Graph Embedding)方向,由于在推荐系统中,用户的行为数据固然的可以表示成图的...

    zhaozhiyong
  • 移动APP的IM后台架构浅析

    IM(InstantMessaging 即时通讯)作为一项基础功能,很多APP都有,比如:手机QQ、微信、易信、钉钉、飞信、旺旺、咚咚、陌陌等。而IM如同我们日...

    meteoric
  • 如何在Ubuntu 14.04上将Symfony应用程序部署到生产环境中

    Symfony是一个用PHP编写的开源Web框架,适用于构建任何规模的项目。它提供了一个基于可重用组件的精心设计的结构,您可以在其上构建自己的PHP应用程序。

    你在哪里

扫码关注云+社区

领取腾讯云代金券