zoukankan      html  css  js  c++  java
  • 认识 GO语言

    Go出生的背景:

      Go最早并不是一个Google的正式项目,而是作为一个"20%"的项目出现的,直到2009年才以开源的方式面向大众,目前go team有稳定的发布周期,大约半年一个新的版本,最新的是1.8。

      Go语言的出身可以说非常豪华,最早对go语言的讨论是由罗伯特·格瑞史莫、罗伯·派克和肯·汤普逊发起的,主要是为了解决c++中出现的问题而发起的项目。肯·汤普逊是c语言和unix的发明者,罗伯特·格瑞史莫参与设计了Java的HotSpot虚拟机和Chrome浏览器的JavaScript V8引擎,罗博·派克在大名鼎鼎的bell lab侵淫多年,参与了Plan9操作系统、C编译器以及多种语言编译器的设计和实现。
    Go语言从2009年开源到现在吸引了很多开发者的注意,分别获得了2009年和2016年的TIOBE之星,如果说2009年那一次是因为Google的影响,那2016年这一次绝对是自身实力的厚积薄发。

    为什么需要一个新的语言:

      传统的语言比如c++,大家花费太多时间来学习如何使用这门语言,而不是如何更好的表达写作者的思想,同时编译花费的时间实在太长,对于编写-编译-运行这个链条来说周期太长。动态语言如Python,由于没有强类型的约束,很多问题需要在运行时发现,这种低级错误更应该交给编译器来发现。
    同时有如下趋势:

    • 人力成本越来越高
    • 机器越来越便宜
    • 机器的性能越来越厉害
    • 在开发效率和运行速度上达到平衡
    • 这就是go诞生的背景。

    Go的哲学:

    简化这门语言必是一门更大的成就 - Rob Pike

    Go的思维方式:

    最小心智负担原则
    最小特性
    最少惊异
    最少犯错机会

    Go的目标是成为互联网的c语言,在保持了c简单明了的基础上,同时加入了一些自己的特性:

    少就是指数级的多
    最少特性原则:如果一个功能不对解决任何问题有显著价值,那么就不提供
    显式表达:所写即所得的语言
    极度简化但完备的OOP
    功能内聚:例如,强大的组合能力
    最友善的 C 语言的支持

    Go是一门以软件工程为目的的语言设计:

    快速编译
    严格的依赖管理
    代码风格的强一致性
    偏向组合而不是继承

    列出几个我认为比较优秀的设计:

    • if for switch之类的语句不需要用括号了,但保留了大括号,方便定位语句块。
    • 可以使用 := 进行自动类型推导。再也不用写诸如 list::iterator it = l.begin()之类的语法了。
    • 使用字母大小写设置可见性(letter case sets visibility)。省去了成员前面一堆的public和private,直接看名字就可以辨认。
    • 保留了指针操作,但去掉了指针算术,指针更安全了,同时留给了程序员使用值语义和引用语义的权利。
    • defer关键字。妈妈再也不用担心句柄没有关闭了。

    Go对OOP的支持有如下特点:

    • 返璞归真,没有继承,只有组合
    • 明确区分复用和抽象,复用使用组合,抽象使用
    • 所见即所得,明确的内存模型,没有vtable之类的东西
    • 鸭子类型,抽象更方便

    Go对并发的支持是一个重要的特性,go有两大神器来支持并发:

    • goroutine:轻量的"线程"
    • channel: 带类型的,协程安全的管道,类似unix里面的pipe.

    Go在工程上的设计:

    Go在工程上的设计可谓体贴入微:

    交叉编译只是一个环境变量的问题:

    • 编译成linux的二进制 GOOS=linux go get github.com/icexin/markdown
    • 编译成windows的二进制 GOOS=windows go get github.com/icexin/markdown
    • 编译成arm上的二进制 GOOS=linux GOARCH=arm go get github.com/icexin/markdown
    • 如果尝试过c的交叉编译的同学就能体会这种便捷性。

    一些一键命令:

    • 一键编译 go build

      go build github.com/icexin/markdown

    • 一键测试 go test

      go test github.com/icexin/markdown

    • 一键下载更新依赖并编译 go get

      go get github.com/icexin/markdown

    Go对文档的支持是目前所有语言里面最贴心的,比如你在github上看到一个项目叫github.com/go-redis/redis,前面加上godoc.org即godoc.org/github.com/go-redis/redis就可以自动生成所有的文档。

    Go的明星项目:

    • Docker,正火热的容器化技术
    • kubernetes,Goole Borg的开源实现
    • Etcd, 类似zookeeper的高可用key-value存储
    • TIDB, 国人开发的Google spanner的开源实现

    go语言特性

    • Go语言是Google于2009年开源的一门新的系统编程语言,主要有以下特点:
    • 静态编译
    • 垃圾回收
    • 简洁的符号和语法
    • 平坦的类型系统
    • 基于CSP的并发模型。
    • 高效简单的工具链。
    • 丰富的标准库

  • 相关阅读:
    Test_StringBuilder
    什么是朋友
    Uncharted4-Resource-Extract
    在使用 .NET Remoting 技术开发跨进程通信时Remoting找不到请求的服务--解决方法
    SourceTree 拉取github资源包时报错:fatal: unable to access 'https://github.com/xxx.git/': OpenSSL SSL_connect: SSL_ERROR_SYSCALL in connection to github.com:443 --解决办法
    .net core3.1 文件导出报错The type initializer for 'Gdip' threw an exception 的解决方法
    .net core3.1文件下载之MimeTypeMapHelper
    .net core3.1 webapi项目部署在centos7中,通过supervisor来做进程守护遇到backoff Exited too quickly (process log may have details)的错误--并提供解决方法
    jenkins安装在ubuntu的解决方法-运维系列
    supervisord.conf配置文件详情
  • 原文地址:https://www.cnblogs.com/xiaoyuya/p/14846505.html
Copyright © 2011-2022 走看看