go语言 订阅
Go(又称 Golang)是 Google 的 Robert Griesemer,Rob Pike 及 Ken Thompson 开发的一种静态强类型、编译型语言。Go 语言语法与 C 相近,但功能上有:内存安全,GC(垃圾回收),结构形态及 CSP-style 并发计算。 展开全文
Go(又称 Golang)是 Google 的 Robert Griesemer,Rob Pike 及 Ken Thompson 开发的一种静态强类型、编译型语言。Go 语言语法与 C 相近,但功能上有:内存安全,GC(垃圾回收),结构形态及 CSP-style 并发计算。
信息
发布于
2009年
最新版本
1.14
发布组织
Google
中文名
Golang
属    性
编程语言
外文名
Golang
go简介
Go(又称Golang)是Google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言。罗伯特·格瑞史莫(Robert Griesemer),罗勃·派克(Rob Pike)及肯·汤普逊(Ken Thompson)于2007年9月开始设计Go,稍后Ian Lance Taylor、Russ Cox加入项目。Go是基于Inferno操作系统所开发的。Go于2009年11月正式宣布推出,成为开放源代码项目,并在Linux及Mac OS X平台上进行了实现,后来追加了Windows系统下的实现。在2016年,Go被软件评价公司TIOBE 选为“TIOBE 2016 年最佳语言”。 目前,Go每半年发布一个二级版本(即从a.x升级到a.y)。 [1] 
收起全文
精华内容
参与话题
问答
  • GO语言零基础入门最佳教程

    千人学习 2019-04-25 10:01:28
    出身名门、血统纯正的Go语言于2012年正式面世。静态语言、函数多返回值、天生并发、自动垃圾回收、安全性高、语法简单、编译快速这几个方面的特性提炼出Go的三个高富帅的标签:运行快、开发快和部署快。本视频...
  • Go语言简介

    千次阅读 多人点赞 2019-04-01 23:44:27
    我身边有位朋友一直和我说:"go语言很好,真的很好呀,很容易上手的,性能又好,又很轻便,要不要一起学呀?"。 经过: 我简单地翻看了菜鸟教程,对go有了初步了解,确实和朋友描述的一致,仿佛打开了新世纪的大门...

    我为什么学习Go这门语言?

    背景:

    我身边有位朋友一直和我说:"go语言很好,真的很好呀,很容易上手的,性能又好,又很轻便,要不要一起学呀?"。

    经过:

    我简单地翻看了菜鸟教程,对go有了初步了解,确实和朋友描述的一致,仿佛打开了新世纪的大门,感觉这门语言很适合我这种嫌麻烦的懒人,初步对这门语言有了一定的兴趣。

    结果:

    偶然有一天,看了一篇关于2019年最值得学习的语言TOP3里面又提到了GO语言,并且讲述了当前这个语言的受欢迎程度和普及度越来越高,越来越多的开发者和企业开始使用该语言,就这样,坚定了我学习go语言的决心。

     

    一、什么是go语言

    Go(又称Golang)语言是Google公司开发的一种静态型、编译型并自带垃圾回收和并发的编程语言。

    官网:https://golang.org/

    历史概要:

    (1)于2007年9月由罗伯特·格瑞史莫,罗勃·派克(Rob Pike)及肯·汤普逊开始设计,稍后Ian Lance Taylor、Russ Cox加入项目

    (2)于2009年11月正式宣布推出,并成为开放源代码项目,因此Go开发团队将 2009 年 11 月 10 日(即该语言正式对外开源的日子)作为其官方生日,并在Linux及Mac OS X平台上进行了实现,后来追加了Windows系统下的实现

    (3)2012年3月28日正式发布go1.0版本

    (3)2016年,Go被软件评价公司TIOBE 选为“TIOBE 2016 年最佳语言”

    (4)如今,Go每半年发布一个二级版本(即从a.x升级到a.y),现最新版本为Go1.12(于2019/02/25发布)

     

    二、go语言特点

    1、上手快,语法简单,我只花了一晚上便对基本语法有了一定的了解,我觉得大概一周左右的时间应该可以用它来解决一些实际问题了

    2、编译输出可执行文件,go语言可以直接输出为目标平台的原生可执行文件,此外,go语言还可以编译输出能导入c语言的静态、动态库,同时go1.7版本开始,go语言支持将代码编译成插件。

    3、工程结构简单,无须头文件,编译文件均来自于后缀名为go的源码文件,无须解决方案、工程文件、Make File等,只要将工程文件按照GOPATH的规则进行填充即可。

    4、编译速度快,go语言利用自己的特性实现并发编译,最开始并发编译的最小元素是包,从go1.9版本开始,最小并发编译元素缩小到函数,整体编译速度提高20%,而且由于其工程结构的简单,在很大程度上加速了编译的过程。

    5、高性能,语言性能上和java相近,但在某些方面表现方面不如java

    6、原生并发支持,无须第三方库,go语言的并发基于goroutine,类似于线程,但并非线程,可以理解为一种虚拟线程。go语言运行时会合理参与调度goroutine,并将goroutine合理分配到各个cpu中,最大限度地使用cpu性能

    7、性能分析,安装go语言的开发包后,使用go语言的工具链可以直接进行go语言的代码性能分析

    8、强大的标准库,涵盖网络、系统、加密、编码、图形等方面

    9、代码风格清晰、简单:

    1)去掉循环冗余的括号

    for(int i = 0; i < 10; i++) {

    }

    =>

    for i := 0; i < 10; i++ {

    }

    2)去掉表达式冗余的括号

    if (i > 0) {

    }

    =>

    if i > 0 {

    }

    3)强制的代码风格,左括号必须紧接语句不换行,具体如1)、2),否则视为代码编译错误,此外,go语言还提供了一套代码格式化工具

    4)不用再纠结于i++和 ++i,对于go语言而言,自增操作不再是一个操作符,而是一个语句,因此go语言中只有i++一种写法

     

    三、使用go语言的项目

    1、Docker,是一种操作系统层面的虚拟化技术,可以在操作系统和应用程序之间进行隔离,也可以称之为容器。

    2、golang,也就是go,go早起源码由c和汇编进行编写,从1.5版本自举后,完全使用go语言自身进行编写。

    3、kubernetes,google公司构建于docker之上的容器调度服务。

    4、etcd,一款分布式、可靠的kv存储系统

    5、beego,一个极轻量级、高伸缩行和高性能的web应用框架

    6、martini,一款快速构建模块化的web应用的web框架

    7、codis,国产的优秀分布式redis解决方案

    8、delve,go语言的强大调试器,被很多集成环境和编辑器整合

     

    本篇文章主要对go语言进行简单的介绍,包括其历史、特点及其在实际项目中的使用,下篇文章将和大家介绍go语言的开发环境的搭建。

     

     

     

     

     

     

     

     

     

     

    展开全文
  • Go语言入门之——基本了解

    千次阅读 2018-08-15 10:22:43
    Go语言基础 一、简介 (2)golang语言特性 2.1. 垃圾回收 内存自动回收,再也不需要开发人员管理内存 开发人员专注业务实现,降低了心智负担 只需要new分配内存,不需要释放 2.2. goroute天然并发 从语言...

    Go语言基础

    一、简介

    (1)什么是go语言?

    2007年,受够了C++煎熬的Google首席软件工程师Rob Pike纠集Robert Griesemer和Ken Thompson两位牛人,决定创造一种新语言来取代C++, 这就是Golang。出现在21世纪的GO语言,虽然不能如愿对C++取而代之,但是其近C的执行性能和近解析型语言的开发效率以及近乎于完美的编译速度,已经风靡全球。特别是在云项目中,大部分都使用了Golang来开发,不得不说,Golang早已深入人心。而对于一个没有历史负担的新项目,Golang或许就是个不二的选择。

    被称为GO语言之父的Rob Pike说,你是否同意GO语言,取决于你是认可少就是多,还是少就是少(Less is more or less is less)。Rob Pike以一种非常朴素的方式,概括了GO语言的整个设计哲学–将简单、实用体现得淋漓尽致。

    很多人将GO语言称为21世纪的C语言,因为GO不仅拥有C的简洁和性能,而且还很好的提供了21世纪互联网环境下服务端开发的各种实用特性,让开发者在语言级别就可以方便的得到自己想要的东西。

    • 1.1、发展历史

      2007年9月,Rob Pike在Google分布式编译平台上进行C++编译,在漫长的等待过程中,他和Robert Griesemer探讨了程序设计语言的一些关键性问题,他们认为,简化编程语言相比于在臃肿的语言上不断增加新特性,会是更大的进步。随后他们在编译结束之前说服了身边的Ken Thompson,觉得有必要为此做一些事情。几天后,他们发起了一个叫Golang的项目,将它作为自由时间的实验项目。

    2008年5月 Google发现了GO语言的巨大潜力,得到了Google的全力支持,这些人开始全职投入GO语言的设计和开发。

    2009年11月 GO语言第一个版本发布。2012年3月 第一个正式版本Go1.0发布。

    2015年8月 go1.5发布,这个版本被认为是历史性的。完全移除C语言部分,使用GO编译GO,少量代码使用汇编实现。另外,他们请来了内存管理方面的权威专家Rick Hudson,对GC进行了重新设计,支持并发GC,解决了一直以来广为诟病的GC时延(STW)问题。并且在此后的版本中,又对GC做了更进一步的优化。到go1.8时,相同业务场景下的GC时延已经可以从go1.1的数秒,控制在1ms以内。GC问题的解决,可以说GO语言在服务端开发方面,几乎抹平了所有的弱点。

    在GO语言的版本迭代过程中,语言特性基本上没有太大的变化,基本上维持在GO1.1的基准上,并且官方承诺,新版本对老版本下开发的代码完全兼容。事实上,GO开发团队在新增语言特性上显得非常谨慎,而在稳定性、编译速度、执行效率以及GC性能等方面进行了持续不断的优化。

    (2)golang语言特性

    • 2.1. 垃圾回收

      • 内存自动回收,再也不需要开发人员管理内存
      • 开发人员专注业务实现,降低了心智负担
      • 只需要new分配内存,不需要释放
    • 2.2. goroute天然并发

      • 从语言层面支持并发,非常简单

      使用一个go则在编译时会自动开启一个线程来执行后面的命令/函数/方法,不用像python需要先调用thread模块来开启线程

      • goroute,轻量级线程,创建成千上万个goroute成为可能
      • 基于CSP(Communicating Sequential Process)模型实现
    • 2.3. goroute线程之间的数据通信——管道

      使用go可以创建一个轻量级的goroute线程,线程之间如何通信,共享数据呢?答案是:使用管道来进行通信。管道需要定义并创建后,才能使用

      定义一个管道:

      var my_pipe chan int
      //my_pipe为管道名,chan为管道关键字表示定义的是一个管道,int表示管道内存储的数据类型

      创建一个管道:

      my_pipe = make(chan int,10)
      //make关键字表示开辟一个内存空间,第一个参数表示创建一个管道,10表示管道能存储的数据类型个数,如果超出则阻塞

      定义和创建可以合并写

      my_pipe := make(chan int,10)

      管道的定义和使用范例:

      //goroute线程之间使用管道进行数据通信
      
      func main() {
      go pi_pie()
      }
      
      func pi_pie() {
        pipe := make(chan int, 10) //make关键字创建一个管道(关键字chan),管道内装int类型的数据,并且管道大小能装10个数字,超过则阻塞
        pipe <- 10                 //向管道内放入数据
        pipe <- 9
        pipe <- 9
        pipe <- 7
        pipe <- 6
        var p1 int
        p1 = <-pipe //从管道取出数据
        fmt.Println(p1)
        fmt.Println(len(pipe))
      }
    • 2.4. 多返回值

      go的函数可以有多个返回值

      “`
      func main() {
      x,y:=p_fun(10,80)
      // x,_ := p_fun(10,80) 多返回值函数时,只要一个返回值
      fmt.Println(x,y)
      }

      //多返回值函数
      func p_fun(a int,b int) (int,int) { //函数传入2个整型参数,返回2个值,都为int类型
      sum := a+b
      avg := (a+b)/2
      return sum,avg
      }

    • 2.5. go的“包”的概念

      • 1.和python一样,把相同功能的代码放到一个目录,称之为包
      • 2.包可以被其他包引用
      • 3.main包是用来生成可执行文件,每个程序只有一个main包
      • 4.包的主要用途是提高代码的可复用性
      • 5.包的引用

      go在首行使用“package <包名>”来声明自己所在的包(主程序包为main包,也可以自定义包名),“import”引入其他的包,go自带的系统包所在的路径已经在“GOROOT”环境变量中设置好了
      可以使用“import”直接引入,而自己定义的包: package <包名> 在import导入时则需要相对路径:第三方包默认在“GOROOT”和“GOPATH”环境变量所在的路径下的src目录下寻找


      Go的package不支持使用“../”方式的相对路径,都是从$GOPATH/src下一层一层找的

    • 2.6. go文件编码规范

      使用gofmt <go文件>使go文件内的代码更规范(缩进等格式更规范),使用gofmt -w <go文件>将原来的go文件修改的更规范

    二、环境搭建

    环境搭建参考网址:https://blog.csdn.net/fearless11/article/details/70543932

    (1)开发环境搭建

    • 1.1 安装Go环境

      • 打开网址https://golang.org/dl/
      • 根据操作系统选择对应的安装包
      • 点击安装包进行安装(linux直接解压)
      • 设置环境变量(linux)

        1. export GOROOT=$PATH:/path/to/go/ #go的家目录

        2. export PATH=PATH:GOROOT/bin/ #go执行命令路径

        3. export GOPATH=/home/user/project/go #项目路径

      • 设置环境变量(window)

      参考:https://blog.csdn.net/fearless11/article/details/70543932

    • 1.2 开发环境搭建(IDE为VScode)

      • 打开网址:https://code.visualstudio.com/
      • 根据操作系统选择对应的安装包
      • 根据操作系统选择对应的安装包
      • 根据操作系统选择对应的安装包
      • 调试工具delve安装

        1. mac: brew install go-delve/delve/delve

        2. linux&windows: go get -u github.com/derekparker/delve/cmd/dlv #请确保已经安装了git

          1. 其他安装方式参考网址:https://github.com/derekparker/delve/tree/master/Documentation/installation
      • 注意事项: VScode开发的项目路径与环境变量 ==“GOPATH”== 的路径要一致,如 $GOPATH = d:\go_build 那么VScode开发的项目也要在d:\go_build目录下
    • 1.3 开发环境搭建(IDE为pycharm)

      '''新版本的pycharm可能已经无法使用'''
      
      pycharm的go语言开发支持插件下载:
      
      1.在pycharm中通过在线搜索go插件来安装
      
      2.可能因为版本原因,pycharm的在线插件安装可能搜索不到,可以采用本地安装的方法:
      
      插件本地安装包下载页面:
      
      https://plugins.jetbrains.com/plugin/5047-go-language-golang-org-support-plugin (pycharm社区版)
      https://plugins.jetbrains.com/plugin/9568-go (pycharm专业版)
      
      根据pycharm的idea版本号(idea版本号在安装目录下的“build.txt/readme.txt”文件中,通常是AA.BBBB.CC的形式)来选择下载插件的版本
      
      > 需要注意的是,pycharm的idea号AA.BBBB.CC 只要 AA与网站上的idea号对应上即可,它是一个范围,如idea号172.4343.24就可以下载范围“172.3968-172.*”对应的插件版本

    (2)编译环境和编译流程

    • 2.1 编译需要的目录环境

      我们的go项目的开发根目录由 GOPATH 环境变量决定了(范例为:d:/go_build),当我们需要开发项目工程时,需要在根目录下先创建src目录(规定死了),
      然后在 src 目录下创建开发的项目名称,如项目名称为app_store, 那么你的go文件应该在 d:/go_build/src/app_store目录下进行开发

      当使用,go get github.com/golang/tools相关命令来安装go的开发插件时,默认下载到 GOPATH/src/==GOPATH/src/github.com/golang/tools/…,然后再将
      该目录下的go文件编译成可执行的二进制文件,放入 $GOPATH/bin 目录下,来使用

      go get <github等网址>....,即在指定网址下载go文件,到GOPATH/src/GOPATH/bin 目录下,之后可以在IDE开发中直接使用(如调试台)

    • 2.2 编译go文件为二进制可执行代码

      使用 go build <go文件所在目录>命令,来进行go文件编译

      例如: ==GOPATH==为 d:/go_build时,编译d:/go_build/src/app_store/app.go文件时,编译的命令为 : `go build app_store/app.go则会在当前目录生成app.exe执行文件(Windows)

      go build时,默认会从$GOPATH/src/ 目录下开始寻找目录,因此只需要相对地址即可

      编译go文件为可执行文件并将文件放到指定位置下

      go build -o %GOPATH%/bin/calcs.exe app_store/app.go
      //将go文件编译到GOPATH变量所在目录下的bin目录里面,名称为calcs,后缀为.exe
      

      添加参数 “- o <执行文件路径(含文件名)>” 即可指定编译的文件位置,需要加上文件名和后缀(Windows为.exe;linux可不要)



    go基础介绍相关代码:

    package main
    
    import (
        "fmt"
        "time"
    )
    
    func main() {
        //   bingfa()
    
        // go pi_pie()
    
        //a := my_sum(10,20)
        //fmt.Println(a)
    
        x,y:=p_fun(10,80)
        // x,_ := p_fun(10,80) 多返回值函数时,只要一个返回值
        fmt.Println(x,y)
    
        time.Sleep(2 * time.Second) //主进程停留2秒,否则并发线程还没有开启并执行完就结束了
    }
    
    //go的高并发
    func bingfa() {
        for i := 0; i <= 100; i++ {
            go fmt.Println(i) //go关键字即表示开启一个线程(轻量级的线程goroute)
        }
    }
    
    //goroute线程之间使用管道进行数据通信
    func pi_pie() {
        pipe := make(chan int, 10) //make关键字创建一个管道(关键字chan),管道内装int类型的数据,并且管道大小能装10个数字,超过则阻塞
        pipe <- 10                 //向管道内放入数据
        pipe <- 9
        pipe <- 9
        pipe <- 7
        pipe <- 6
        var p1 int
        p1 = <-pipe //从管道取出数据
        fmt.Println(p1)
        fmt.Println(len(pipe))
    }
    
    //带返回值的函数
    func my_sum(a int,b int) int {  //函数传入2个参数,类型为整型,返回值也为整型
        sum := a+b
        return sum
    }
    
    //多返回值函数
    func p_fun(a int,b int) (int,int) { //函数传入2个整型参数,返回2个值,都为int类型
        sum := a+b
        avg := (a+b)/2
        return sum,avg
    }


    go开发部分插件无法安装解决方案:

    官方的安装文档是使用go get github.com/tools/godep,很可惜,因为“网络”问题会报一个找不到golang.org/x/tools/go/vcs的错误。

    然而https://github.com/golang/tools 是 golang.org/x/tools 的一个镜像,代码是一样的,所以我是如下安装的:

    • 1.执行命令go get github.com/golang/tools

    • 2.在GOPATH\src\github.com\golang目录下就有tools文件夹。

    • 3.在src下和github.com平级新建golang.org文件下,在此文件夹下建x文件夹,然后将tools文件夹都复制进去。

    • 4.然后再执行go get github.com/tools/godep

    此时godep安装在你的GOPATH\bin目录下。

    对其他类似 golang.org/x/tools/go/vcs 的错误的办法也管用

    展开全文
  • 为什么Go语言在中国格外的"火

    万次阅读 多人点赞 2019-07-19 08:47:22
    go语言推出有几年了,似乎不温不火。但是在中国范围内,确实被关注的一塌糊涂。这是2017年2月份TIOBE出的编程语言排名:在拉勾网上搜索go的职位,结果有119个(2017年2月14日搜索结果),似乎还没有那么火爆:但是在...

    go语言推出有几年了,似乎不温不火。但是在中国范围内,确实被关注的一塌糊涂。

    这是2017年2月份TIOBE出的编程语言排名:

    这里写图片描述

    在拉勾网上搜索go的职位,结果有119个(2017年2月14日搜索结果),似乎还没有那么火爆:

    这里写图片描述

    但是在中国,很多公司,很多程序员都在谈论go语言,也就是说在中国对于go的关注异常火爆。

    根据谷歌搜索的统计,如下图:
    The graph above shows the searches for “golang” by country on Google Trends.
    这里写图片描述

    外国人专门写了一篇文章,来分析为什么go在中国如此火:
    《Why is Golang popular in China?》
    http://herman.asia/why-is-go-popular-in-china

    下面是知乎的回复:
    作者:匿名用户
    链接:https://www.zhihu.com/question/30172794/answer/47122000
    来源:知乎
    著作权归作者所有,转载请联系作者获得授权。

    这个“火”字看你怎么理解了。
    Go在国内更火只是感觉上的。比如推文,以及谈论的相关话题较多而已(但能有nodejs多么?),本身中国人口数量就多,按这个衡量的办法去看的话,swift在国内也比在国外火;
    实际上Go在国外更火(这里的火是实际的使用情况),对比一下国内和国外使用Go的程度、数量,Go相关的技术大会举办的频率和数量就一目了然了。
    
    Go在国内真正上被全栈使用的就七牛一家,但国外除了docker,coreOS还有很多初创企业。
    国内比较有影响力的就一个beego框架,你看看国外的有多少。
    
    去github上搜一下active的Go的project数量,看看Go在国外是不是没人用?我反正在github的trending里面几乎每天都能看到Go的project。hacker news上面有关Go的“xxx writen in Go”的炒作文也不要太多。
    这个 dariubs/GoBooks · GitHub 是有人整理的Go相关的书籍,看看是不是国外的书籍比国内的少?8月份K&R中的K也要推出属于Go的圣经了。
    
    另外老有人喜欢说:Google喜欢关闭产品,这玩意儿迟早死掉。可惜golang是开源项目,关不掉的,CloudFlare那个crypto的patch(Gerrit Code Review)以后可能会进Go的标准库,Godep已经成为事实上的包管理标准,这些都是社区自己搞出来的,和google一毛线关系没有。另外就是最近google自己一些主力产品或者平台在优先支持语言上,Go总是和java,c/c++,python一起名列其中,grpc就是一个例子等等。所以,觉得Go只是google的一个玩具的人,你的观点能不能站得住脚,自己掂量吧。
    
    我的个人观点是:
    Go显示已经站住了脚跟(如果是2013年,我还是不敢说这种话的),找到了属于自己的空间,但是比起那些主流的甚至nodeJS来说,还是使用的不够广泛。这个语言人为炒作也罢,一些人认为的google光环也罢,实际使用也罢,总之:
    这个语言已经站住脚跟了,能用于并且已经用于生产环境了,接下来几年只会一直呈上升势头。
    

    个人观点:

    1 一些真正使用go语言的公司:
    这些公司在高速发展的同时,Golang也因此在国内逐渐传播开来。在云计算时代,从国内Go 语言发展和应用来看,七牛算是国内第一家选 Go 语言做服务端的公司。早在2011年,当Go语法还没完全稳定下来的情况下,七牛就已经选择将Go作为存储服务端的主题语言。关于这点,七牛CEO许式伟谈到:编程哲学的重塑是 Go 语言独树一帜的根本原因,其它语言仍难以摆脱 OOP 或函数式编程的烙印,只有 Go 完全放弃了这些,对编程范式重新思考,对热门的面向对象编程提供极度简约但却完备的支持。Go 是互联网时代的C语言,不仅会制霸云计算,10 年内将会制霸整个 IT 领域。

    2 在中国程序员眼中,谷歌出品必属精品
    确实,在互联网世界,在开源世界,Google为我们贡献了太多太多。

    3 创业公司假装高逼格,假装geek范儿
    The word geek is a slang term originally used to describe eccentric or non-mainstream people; in current use, the word typically connotes an expert or enthusiast or a person obsessed with a hobby or intellectual pursuit, with a general pejorative meaning of a “peculiar person, especially one who is perceived to be overly intellectual, unfashionable, or socially awkward”.

    4 docker异常火爆,带动了对go语言的关注
    Docker是PaaS供应商dotCloud开源的一个基于LXC 的高级容器引擎,源代码托管在 GitHub 上, 基于Go语言开发并遵从Apache 2.0协议开源。

    5 go语言本身的一些特性
    部署简单
    并发性好
    性能好
    。。。

    6《go语言从入门到放弃》一书的火爆

    展开全文
  • 我为什么放弃Go语言

    万次阅读 多人点赞 2014-04-14 19:24:19
    我为什么放弃Go语言?有好几次,当我想起来的时候,总是会问自己:这个决定是正确的吗?是明智和理性的吗?其实我一直在认真思考这个问题。开门见山地说,我当初放弃Go语言,就是因为两个“不爽”:第一,对Go语言...

    我为什么放弃Go语言

    作者:庄晓立(Liigo)

    日期:2014年3月

    原创链接:http://blog.csdn.net/liigo/article/details/23699459

    转载请注明出处:http://blog.csdn.net/liigo

     

    有好几次,当我想起来的时候,总是会问自己:我为什么要放弃Go语言?这个决定是正确的吗?是明智和理性的吗?其实我一直在认真思考这个问题。

    开门见山地说,我当初放弃Go语言(golang),就是因为两个“不爽”:第一,对Go语言本身不爽;第二,对Go语言社区里的某些人不爽。毫无疑问,这是非常主观的结论。但是我有足够详实的客观的论据,用以支撑这个看似主观的结论。

    文末附有本文更新日志。

     

    第0节:我的Go语言经历

    先说说我的经历吧,以避免被无缘无故地当作Go语言的低级黑。

    2009年底,Go语言(golang)第一个公开版本发布,笼罩着“Google公司制造”的光环,吸引了许多慕名而来的尝鲜者,我(Liigo)也身居其中,笼统的看了一些Go语言的资料,学习了基础的教程,因对其语法中的分号和花括号不满,很快就遗忘掉了,没拿它当一回事。

    两年之后,2011年底,Go语言发布1.0的计划被提上日程,相关的报道又多起来,我再次关注它,[重新评估][1]之后决定深入参与Go语言。我订阅了其users、nuts、dev、commits等官方邮件组,坚持每天阅读其中的电子邮件,以及开发者提交的每一次源代码更新,给Go提交了许多改进意见,甚至包括[修改Go语言编译器源代码][2]直接参与开发任务。如此持续了数月时间。

    到2012年初,Go 1.0发布,语言和标准库都已经基本定型,不可能再有大幅改进,我对Go语言未能在1.0定型之前更上一个台阶、实现自我突破,甚至带着诸多明显缺陷走向1.0,感到非常失望,因而逐渐疏远了它(所以Go 1.0之后的事情我很少关心)。后来看到即将发布的Go 1.1的Release Note,发现语言层面没有太大改变,只是在库和工具层面有所修补和改进,感到它尚在幼年就失去成长的动力,越发失望。外加Go语言社区里的某些人,其中也包括Google公司负责开发Go语言的某些人,其态度、言行,让我极度厌恶,促使我决绝地离弃Go语言。

    在上一个10年,我(Liigo)在我所属的公司里,深度参与了两个编程语言项目的开发。我想,对于如何判断某个编程语言的优劣,或者说至少对于如何判断某个编程语言是否适合于我自己,我应该还是有一点发言权的。

    [1]: https://plus.google.com/+LiigoZhuang/posts/CpRNPeDXUDW

    [2]: http://blog.csdn.net/liigo/article/details/7467309

    第1节:我为什么对Go语言不爽?

    Go语言有很多让我不爽之处,这里列出我现在还能记起的其中一部分,排名基本上不分先后。读者们耐心地看完之后,还能淡定地说一句“我不在乎”吗?

    1.1 不允许左花括号另起一行

    关于对花括号的摆放,在C语言、C++、Java、C#等社区中,十余年来存在持续争议,从未形成一致意见。在我看来,这本来就是主观倾向很重的抉择,不违反原则不涉及是非的情况下,不应该搞一刀切,让程序员或团队自己选择就足够了。编程语言本身强行限制,把自己的喜好强加给别人,得不偿失。无论倾向于其中任意一种,必然得罪与其对立的一群人。虽然我现在已经习惯了把左花括号放在行尾,但一想到被禁止其他选择,就感到十分不爽。Go语言这这个问题上,没有做到“团结一切可以团结的力量”不说,还有意给自己树敌,太失败了。

    1.2 编译器莫名其妙地给行尾加上分号

    对Go语言本身而言,行尾的分号是可以省略的。但是在其编译器(gc)的实现中,为了方便编译器开发者,却在词法分析阶段强行添加了行尾的分号,反过来又影响到语言规范,对“怎样添加分号”做出特殊规定。这种变态做法前无古人。在左花括号被意外放到下一行行首的情况下,它自动在上一行行尾添加的分号,会导致莫名其妙的编译错误(Go 1.0之前),连它自己都解释不明白。如果实在处理不好分号,干脆不要省略分号得了;或者,Scala和JavaScript的编译器是开源的,跟它们学学怎么处理省略行尾分号可以吗?

    1.3 极度强调编译速度,不惜放弃本应提供的功能

    程序员是人不是神,编码过程中免不了因为大意或疏忽犯一些错。其中有一些,是大家集体性的很容易就中招的错误(Go语言里的例子我暂时想不起来,C++里的例子有“基类析构函数不是虚函数”)。这时候编译器应该站出来,多做一些检查、约束、核对性工作,尽量阻止常规错误的发生,尽量不让有潜在错误的代码编译通过,必要时给出一些警告或提示,让程序员留意。编译器不就是机器么,不就是应该多做脏活累活杂活、减少人的心智负担么?编译器多做一项检查,可能会避免数十万程序员今后多年内无数次犯同样的错误,节省的时间不计其数,这是功德无量的好事。但是Go编译器的作者们可不这么想,他们不愿意自己多花几个小时给编译器增加新功能,觉得那是亏本,反而减慢了编译速度。他们以影响编译速度为由,拒绝了很多对编译器改进的要求。典型的因噎废食。强调编译速度固然值得赞赏,但如果因此放弃应有的功能,我不赞成。

    1.4 错误处理机制太原始

    在Go语言中处理错误的基本模式是:函数通常返回多个值,其中最后一个值是error类型,用于表示错误类型极其描述;调用者每次调用完一个函数,都需要检查这个error并进行相应的错误处理:if err != nil { /*这种代码写多了不想吐么*/ }。此模式跟C语言那种很原始的错误处理相比如出一辙,并无实质性改进。实际应用中很容易形成多层嵌套的if else语句,可以想一想这个编码场景:先判断文件是否存在,如果存在则打开文件,如果打开成功则读取文件,如果读取成功再写入一段数据,最后关闭文件,别忘了还要处理每一步骤中出现错误的情况,这代码写出来得有多变态、多丑陋?实践中普遍的做法是,判断操作出错后提前return,以避免多层花括号嵌套,但这么做的后果是,许多错误处理代码被放在前面突出的位置,常规的处理逻辑反而被掩埋到后面去了,代码可读性极差。而且,error对象的标准接口只能返回一个错误文本,有时候调用者为了区分不同的错误类型,甚至需要解析该文本。除此之外,你只能手工强制转换error类型到特定子类型(静态类型的优势没了)。至于panic - recover机制,致命的缺陷是不能跨越库的边界使用,注定是一个半成品,最多只能在自己的pkg里面玩一玩。Java的异常处理虽然也有自身的问题(比如Checked Exceptions),但总体上还是比Go的错误处理高明很多。

    1.5 垃圾回收器(GC)不完善、有重大缺陷

    在Go 1.0前夕,其垃圾回收器在32位环境下有内存泄漏,一直拖着不肯改进,这且不说。Go语言垃圾回收器真正致命的缺陷是,会导致整个进程不可预知的间歇性停顿(Stop the World)。像某些大型后台服务程序,如游戏服务器、APP容器等,由于占用内存巨大,其内存对象数量极多,GC完成一次回收周期,可能需要数秒甚至更长时间,这段时间内,整个服务进程是阻塞的、停顿的,在外界看来就是服务中断、无响应,再牛逼的并发机制到了这里统统失效。垃圾回收器定期启动,每次启动就导致短暂的服务中断,这样下去,还有人敢用吗?这可是后台服务器进程,是Go语言的重点应用领域。以上现象可不是我假设出来的,而是事实存在的现实问题,受其严重困扰的也不是一家两家了(2013年底ECUG Con 2013京东的刘奇提到了Go语言的GC、defer、标准库实现是性能杀手,最大的痛苦是GC;美团的沈锋也提到Go语言的GC导致后台服务间隔性停顿是最大的问题。更早的网络游戏仙侠道开发团队也曾受Go垃圾回收的沉重打击)。在实践中,你必须努力减少进程中的对象数量,以便把GC导致的间歇性停顿控制在可接受范围内。除此之外你别无选择(难道你还想自己更换GC算法、甚至砍掉GC?那还是Go语言吗?)。跳出圈外,我近期一直在思考,一定需要垃圾回收器吗?没有垃圾回收器就一定是历史的倒退吗?(可能会新写一篇博客文章专题探讨。)

    2016年3月3日Liigo补记:直到2015年底,Go 1.5新GC发布后数月,仍获知有大陆圈内知名团队因为GC的原因考虑换掉Go语言,颇有感触。当软件系统逐步发展到更庞大更复杂的时候,Go语言的垃圾回收器(GC)就变成了指不定啥时候会出现的拦路虎,让人进退两难。进,暂时没有确切有效的技术手段对付响应延迟和内存暴涨;退,多年开发付出的心血付之东流损失惨重。语言选型之前多做调查分析,如果一定要用Go语言开发,控制系统规模和复杂度,避开底层的核心业务,可能是比较明智的选择。

    1.6 禁止未使用变量和多余import

    Go编译器不允许存在被未被使用的变量和多余的import,如果存在,必然导致编译错误。但是现实情况是,在代码编写、重构、调试过程中,例如,临时性的注释掉一行代码,很容易就会导致同时出现未使用的变量和多余的import,直接编译错误了,你必须相应的把变量定义注释掉,再翻页回到文件首部把多余的import也注释掉,……等事情办完了,想把刚才注释的代码找回来,又要好几个麻烦的步骤。还有一个让人蛋疼的问题,编写数据库相关的代码时,如果你import某数据库驱动的pkg,它编译给你报错,说不需要import这个未被使用的pkg;但如果你听信编译器的话删掉该import,编译是通过了,运行时必然报错,说找不到数据库驱动;你看看程序员被折腾的两边不是人,最后不得不请出大神:`import _`。对待这种问题,一个比较好的解决方案是,视其为编译警告而非编译错误。但是Go语言开发者很固执,不容许这种折中方案。

    1.7 创建对象的方式太多令人纠结

    创建对象的方式,调用new函数、调用make函数、调用New方法、使用花括号语法直接初始化结构体,你选哪一种?不好选择,因为没有一个固定的模式。从实践中看,如果要创建一个语言内置类型(如channel、map)的对象,通常用make函数创建;如果要创建标准库或第三方库定义的类型的对象,首先要去文档里找一下有没有New方法,如果有就最好调用New方法创建对象,如果没有New方法,则退而求其次,用初始化结构体的方式创建其对象。这个过程颇为周折,不像C++、Java、C#那样直接new就行了。

    1.8 对象没有构造函数和析构函数

    没有构造函数还好说,毕竟还有自定义的New方法,大致也算是构造函数了。没有析构函数就比较难受了,没法实现RAII。额外的人工处理资源清理工作,无疑加重了程序员的心智负担。没人性啊,还嫌我们程序员加班还少吗?C++里有析构函数,Java里虽然没有析构函数但是有人家finally语句啊,Go呢,什么都没有。没错,你有个defer,可是那个defer问题更大,详见下文吧。

    1.9 defer语句的语义设定不甚合理

    Go语言设计defer语句的出发点是好的,把释放资源的“代码”放在靠近创建资源的地方,但把释放资源的“动作”推迟(defer)到函数返回前执行。遗憾的是其执行时机的设置似乎有些不甚合理。设想有一个需要长期运行的函数,其中有无限循环语句,在循环体内不断的创建资源(或分配内存),并用defer语句确保释放。由于函数一直运行没有返回,所有defer语句都得不到执行,循环过程中创建的大量短暂性资源一直积累着,得不到回收。而且,系统为了存储defer列表还要额外占用资源,也是持续增加的。这样下去,过不了多久,整个系统就要因为资源耗尽而崩溃。像这类长期运行的函数,http.ListenAndServe()就是典型的例子。在Go语言重点应用领域,可以说几乎每一个后台服务程序都必然有这么一类函数,往往还都是程序的核心部分。如果程序员不小心在这些函数中使用了defer语句,可以说后患无穷。如果语言设计者把defer的语义设定为在所属代码块结束时(而非函数返回时)执行,是不是更好一点呢?可是Go 1.0早已发布定型,为了保持向后兼容性,已经不可能改变了。小心使用defer语句!一不小心就中招。

    1.10 许多语言内置设施不支持用户定义的类型

    for in、make、range、channel、map等都仅支持语言内置类型,不支持用户定义的类型(?)。用户定义的类型没法支持for in循环,用户不能编写像make、range那样“参数类型和个数”甚至“返回值类型和个数”都可变的函数,不能编写像channel、map那样类似泛型的数据类型。语言内置的那些东西,处处充斥着斧凿的痕迹。这体现了语言设计的局限性、封闭性、不完善,可扩展性差,像是新手作品——且不论其设计者和实现者如何权威。延伸阅读:Go语言是30年前的陈旧设计思想,用户定义的东西几乎都是二等公民(Tikhon Jelvis)。

    1.11 没有泛型支持,常见数据类型接口丑陋

    没有泛型的话,List、Set、Tree这些常见的基础性数据类型的接口就只能很丑陋:放进去的对象是一个具体的类型,取出来之后成了无类型的interface{}(可以视为所有类型的基础类型),还得强制类型转换之后才能继续使用,令人无语。Go语言缺少min、max这类函数,求数值绝对值的函数abs只接收/返回双精度小数类型,排序接口只能借助sort.Interface无奈的回避了被比较对象的类型,等等等等,都是没有泛型导致的结果。没有泛型,接口很难优雅起来。Go开发者没有明确拒绝泛型,只是说还没有找到很好的方法实现泛型(能不能学学已经开源的语言呀)。现实是,Go 1.0已经定型,泛型还没有,那些丑陋的接口为了保持向后兼容必须长期存在着。延伸阅读:HN网友抱怨Go没有泛型

    1.12 实现接口不需要明确声明

    这一条通常是被当作Go语言的优点来宣传的。但是也有人不赞同,比如我。如果一个类型用Go语言的方式默默的实现了某个接口,使用者和代码维护者都很难发现这一点(除非仔细核对该类型的每一个方法的函数签名,并跟所有可能的接口定义相互对照),自然也想不到与该接口有关的应用,显得十分隐晦,不直观。支持者可能会辩解说,我可以在文档中注明它实现了哪些接口。问题是,写在文档中,还不如直接写到类型定义上呢,至少还能得到编译器的静态类型检查。缺少了编译器的支持,当接口类型的函数签名被改变时,当实现该接口的类型方法被无意中改变时,实现者可能很难意识到,该类型实现该接口的隐含约束事实上已经被打破了。又有人辩解说,我可以通过单元测试确保类型正确实现了接口呀。我想说的是,明明可以通过明确声明实现接口,享受编译器提供的类型检查,你却要自己找麻烦,去写原本多余的单元测试,找虐很爽吗?Go语言的这种做法,除了减少一些对接口所在库的依赖之外,没有其他好处,得不偿失。延伸阅读:为什么我不喜欢Go语言式的接口(老赵)。

    1.13 省掉小括号却省不掉花括号

    Go语言里面的if语句,其条件表达式不需要用小括号扩起来,这被作为“代码比较简洁”的证据来宣传。可是,你省掉了小括号,却不能省掉大括号啊,一条完整的if语句至少还得三行吧,人家C、C++、Java都可以在一行之内搞定的(可以省掉花括号)。人家还有x?a:b表达式呢,也是一行搞定,你Go语言用if else写至少得五行吧?哪里简洁了?

    1.14 编译生成的可执行文件尺寸非常大

    记得当年我写了一个很简单的程序,把所有系统环境变量的名称和值输出到控制台,核心代码也就那么三五行,结果编译出来把我吓坏了:EXE文件的大小超过4MB。如果是C语言写的同样功能的程序,0.04MB都是多的。我把这个信息反馈到官方社区,结果人家不在乎。是,我知道现在的硬盘容量都数百GB、上TB了……可您这种优化程度……怎么让我相信您在其他地方也能做到不错呢。(再次强调一遍,我所有的经验和数据都来自Go 1.0发布前夕。)

    1.15 不支持动态加载类库

    静态编译的程序当然是很好的,没有额外的运行时依赖,部署时很方便。但是之前我们说了,静态编译的文件尺寸很大。如果一个软件系统由多个可执行程序构成,累加起来就很可观。如果用动态编译,发布时带同一套动态库,可以节省很多容量。更关键的是,动态库可以运行时加载和卸载,这是静态库做不到的。还有那些LGPL等协议的第三方C库受版权限制是不允许静态编译的。至于动态库的版本管理难题,可以通过给动态库内的所有符号添加版本号解决。无论如何,应该给予程序员选择权,让他们自己决定使用静态库还是动态库。一刀切的拒绝动态编译是不合适的。

    1.16 其他

    • 不支持方法和函数重载(overload)
    • 导入pkg的import语句后边部分竟然是文本(import ”fmt”)
    • 没有enum类型,全局性常量难以分类,iota把简单的事情复杂化
    • 定义对象方法时,receiver类型应该选用指针还是非指针让人纠结
    • 定义结构体和接口的语法稍繁,interface XXX{} struct YYY{} 不是更简洁吗?前面加上type关键字显得罗嗦。
    • 测试类库testing里面没有AssertEqual函数,标准库的单元测试代码中充斥着if a != b { t.Fatal(...) }
    • 语言太简单,以至于不得不放弃很多有用的特性,“保持语言简单”往往成为拒绝改进的理由。
    • 标准库的实现总体来说不甚理想,其代码质量大概处于“基本可用”的程度,真正到企业级应用领域,往往就会暴露出诸多不足之处。
    • 版本都发展到1.2了,goroutine调度器依旧默认仅使用一个系统线程。GOMAXPROCS的长期存在似乎暗示着官方从来没有足够的信心,让调度器正确安全地运行在多核环境中。这跟Go语言自身以并发为核心的定位有致命的矛盾。(直到2015年下半年1.5发布后才有改观
    • 官方发行版中包含了一个叫oracle的辅助程序,与Oracle数据库毫无关系,却完全无视两者之间的名称混淆。

    上面列出的是我目前还能想到的对Go语言的不爽之处,毕竟时间过去两年多,还有一些早就遗忘了。其中一部分固然是小不爽,可能忍一忍就过去了,但是很多不爽积累起来,总会时不时地让人难受,时间久了有自虐的感觉。程序员的工作生活本来就够枯燥的,何必呢。

    必须要说的是,对于其中大多数不爽之处,我(Liigo)都曾经试图改变过它们:在Go 1.0版本发布之前,我在其官方邮件组提过很多意见和建议(甚至包括提交代码CL),极力据理力争,可以说付出很大努力,目的就是希望定型后的Go语言是一个相对完善的、没有明显缺陷的编程语言。结果是令人失望的,我人微言轻、势单力薄,不可能影响整个语言的发展走向。1.0之前,最佳的否定自我、超越自我的机会,就这么遗憾地错过了。我最终发现,很多时候不是技术问题,而是技术人员的问题。

    第2节:我为什么对Go语言的某些人不爽?

    这里提到的“某些人”主要是两类:一、负责专职开发Go语言的Google公司员工;二、Go语言的推崇者和脑残粉丝。我跟这两类人打过很多交道,不胜其烦。再次强调一遍,我指的是“某些”人,而不是所有人,请不要对号入座。

    Google公司内部负责专职开发Go语言的核心开发组某些成员,他们倾向于闭门造车,固执己见,对第三方提出的建议不重视。他们常常挂在嘴边的口头禅是:现有的做法很好、不需要那个功能、我们开发Go语言是给Google自己用的、Google不需要那个功能、如果你一定要改请fork之后自己改、别干提意见请提交代码。很多言行都是“反开源”的。通过一些具体的例子,还能更形象的看清这一层。就留下作为课后作业吧。

    我最不能接受的就是他们对1.0版本的散漫处理。那时候Go还没到1.0,初出茅庐的小学生,有很大的改进空间,是全面翻新的最佳时机,彼时不改更待何时?1.0是打地基的版本,基础不牢靠,等1.0定型之后,处处受到向后兼容性的牵制,束手缚脚,每前进一步都阻力重重。急于发布1.0,过早定型,留下诸多遗憾,彰显了开发者的功利性强,在技术上不追求尽善尽美。

    Go语言的核心开发成员,他们日常的开发工作是使用C语言——Go语言的编译器和运行时库,包括语言核心数据结构和算法map、channel、scheduler,都是C开发的——真正用自己开发的Go语言进行实际的大型应用开发的机会并不多。虽然标准库是用Go语言自己写的,但他们却没有大范围使用标准库的经历。实际上,他们缺少使用Go语言的实战开发经验,往往不知道处于开发第一线的用户真正需要什么,无法做到设身处地为程序员着想。缺少使用Go语言的亲身经历,也意味着他们不能在日常开发中,及时发现和改进Go语言的不足。这也是他们往往自我感觉良好的原因。(2016年5月15日补记:2015年8月Go 1.5版本之后不再使用C语言开发。)

    Go语言社区里,有一大批Go语言的推崇者和脑残粉丝,他们满足于现状,不思进取,处处维护心中的“神”,容不得批评意见,不支持对语言的改进要求。当年我对Go语言的很多批评和改进意见,极少得到他们的支持,他们不但不支持还给予打击,我就纳闷了,他们难道不希望Go语言更完善、更优秀吗?我后来才意识到,他们跟乔帮主的苹果脑残粉丝们,言行一脉相承,具有极端宗教倾向,神化主子、打击异己真是不遗余力呀。简简单单的技术问题,就能被他们上升到意识形态之争。现实的例子是蛮多的,有兴趣的到网上去找吧。正是因为他们的存在,导致更多理智、清醒的Go语言用户无法真正融入整个社区。

    如果一个项目、团队、社区,到处充斥着赞美、孤芳自赏、自我满足、不思进取,排斥不同意见,拒绝接纳新方案,我想不到它还有什么前进的动力。逆水行舟,是不进反退的。

    2016年5月15日补记:@netroby:“Golang社区的神经病和固执,我深有体会。我曾经发过Issue,请求Golang官方,能为doc加上高亮,这样浏览器阅读文档的时候,能快速阅读代码参考。但是被各种拒绝. 他们的理由是很多开发者不喜欢高亮。” https://github.com/golang/go/issues/13178

    2016年5月15日补记:C++天才人物、D语言联合创始人Andrei Alexandrescu:“Go所走的路线在一些问题上持有极其强硬和死板态度,这些问题有大有小。在比较大的方面,泛型编程被严格控制,甚至贬低到只有"N"个字;有关泛型编程的讨论都是试图去劝阻任何有意义的尝试,这已经足够让人觉得耻辱。从长远来看,技术问题的政治化是一种极其有害的模式,所以希望Go社区能够找到修正它的方法。”  http://www.csdn.net/article/2015-12-20/2826517

    第3节:还有比Go语言更好的选择吗?

    我始终坚持一个颇有辩证法意味的哲学观点:在更好的替代品出现之前,现有的就是最好的。失望是没有用的,抱怨是没有用的,要么接受,要么逃离。我曾经努力尝试过接受Go语言,失败之后,注定要逃离。发现更好的替代品之后,无疑加速了逃离过程。还有比Go语言更好的替代品吗?当然有。作为一个屌丝程序员,我应该告诉你它是什么,但是我不说。现在还不是时候。我现在不想把这两门编程语言对立起来,引发另一场潜在的语言战争。这不是此文的本意。如果你非要从现有信息中推测它是什么,那完全是你自己的事。如果你原意等,它或许很快会浮出水面,也未可知。

    第4节:写在最后

    我不原意被别人代表,也不愿意代表别人。这篇文章写的是我,一个叫Liigo的80后屌丝程序员,自己的观点。你完全可以主观地认为它是主观的,也完全可以客观地以为它是客观的,无论如何,那是你的观点。

    这篇文字是从记忆里收拾出来的。有些细节虽可考,而不值得考。——我早已逃离,不愿再回到当年的场景。文中涉及的某些细节,可能会因为些许偏差,影响其准确性;也可能会因为缺少出处,影响其客观性。如果有人较真,非要去核实,我相信那些东西应该还在那里。

    Go语言也非上文所述一无是处,它当然有它的优势和特色。读者们判断一件事物,应该是优劣并陈,做综合分析,不能单听我一家负面之言。但是它的那些不爽之处,始终让我不爽,且不能从其优秀处得以完全中和,这是我不得不放弃它的原因。

     

     


     

    Liigo 2014-4-29 补记1

    Go语言社区还有一个很奇特的现象,就是中国社区独大,国外社区要小的多。有外国网友还专门写了一篇文章研究《为什么Golang中国社区独大》这个问题(文中也提到了我这篇博文)。通常来说,在IT和软件领域,向来都是国外先进国家引领技术潮流,然后国内缓慢跟进。而到了Go语言这里,恰恰反过来了,似乎暗示着在国外的主流软件开发技术人员并不怎么待见Go语言,Go只是在国内受到一帮人的盲目推崇而已,至于这帮人的眼光如何,反正我不看好。

    Liigo 2014-4-29 补记2

    著名的编程语言研究专家王垠写了一篇《对 Go 语言的综合评价》(晚于本博文发表约三五天),也是总体上持批判态度,看衰Go语言。读者们可以对照阅读。

    Liigo 2014-4-29 补记3

    Go语言的拥护者们,似乎连Go语言的“核心优势”都说不出几条。知乎上很有人气的一条问答《为什么要使用 Go 语言,Go 语言的优势在哪里》,连静态编译、GC、跨平台都拿出来说了(无视C/C++/Java),甚至连简单易学(无视Python/易语言)、“丰富的”标准库(跟谁比?敢跟Java/C#/Python比么?)、好用的工具链(gofmt)都扯出来了,可见除了“并发、网络”之外,他们也讲不出另外的什么核心优势了,只能靠一些周边的东西凑数。

    Liigo 2015-1-31 补记4

    全世界认为Go语言不好的可不只是我Liigo一个人。国外著名的问答网站Quora上面有个人气很高的提问,“为什么不要用Go语言”(英文网页),看看那排名最前的两个答案,以及广大程序员们给这两个答案的数百个“赞”,都足以说明Go语言自身的问题是客观存在的。人民群众的眼睛是雪亮的。

    Liigo 2015-4-1 补记5

    文中1.10(黑魔法)和1.12(接口)章节增加了两处“延伸阅读”链接,被引用的链接后面均有大量网友评论。此举主要是为了说明本文观点并非一家之言。

    Liigo 2015-5-29 补记6

    补充说明Go语言直到2015年下半年1.5发布后才将GOMAXPROCS设置为大于1的默认值(HN),他们文中承认之前一直默认设置为1是因为调度器不完善(与我此文最初发表时的猜测一致)。

    Liigo 2015-6-2 补记7

    补充两篇英文:Why Go Is Not Good(作者Will Yager重点批评了Go语言的设计不佳甚至是倒退),Leaving Go(作者Danny Gratzer放弃Go语言的原因主要是:没有泛型,充满黑魔法)。这两篇文章都是针对具体问题做具体分析的,与本文写作精神一致,务实不务虚。其中提到的对Go语言不满的地方,本文也多有涉及,结论类似。

    Liigo 2015-7-2 补记8

    前两天网上出现了一篇本文的驳文,《驳狗屎文 "我为什么放弃Go语言"》,作者是chai2010,请读者们参照阅读,顺便领略一下本文后半部分描述过的Go粉的"风采"。(这篇驳文至少有两个好处:1 它全文引用了本文(便于读者参照);2 使用了本文当时的最新版(包含了补记7)。)

    Liigo 2015-7-3 补记9

    文中1.5节(垃圾回收器/GC)增加 “Stop the world” 相关的三个链接。

    Liigo 2015-7-17 补记10

    文中1.11节(泛型)增加来自HN的延伸阅读链接,开发者们抱怨Go欠缺泛型支持。

    Liigo 2016-3-3 补记11

    文中1.5节(垃圾回收器/GC)末尾增加一段,再次提示开发者重视Go语言GC的潜在问题。

    Liigo 2016-5-15 补记12:

    文中第2节(我为什么对Go社区的人不爽)增加netroby和D语言联合创始人的现身说法。补充说明Go 1.5后不再使用C语言开发。

    Liigo 2020-2-19 补记13:

    本文末尾增加Golang 2.0泛型相关信息。

     

    关于对作者倾向性质疑的声明

    读者看到本文全都是Go语言负面性的内容,没有涉及一点Go语言好的地方,因而质疑作者的盲目倾向。出现这种结果完全是因为文章主题所限。此前本文末尾也简单提到过,评估一件事物,应当优劣并陈,优势项加分,劣势项减分,做综合评估分析。如果有突出的重大优势,则可以容忍一些较大的劣势;但如果有致命的劣势或多项大劣势,则再大的优势也无法与之中和。中国乒乓球界讲领军人物必须做到“技术全面,特长突出,没有明显弱点”,我甚为赞同。用这句话套用Go语言,可以说“技术不全面(人家自己说成简洁),有一点特长(并发),有明显的弱点(包括但不限于本文列出的这些)”。如此一来,优势都被劣势中和了,劣势还是那么突出,自然是得负分,自然是弃用,自然是没有好印象。我在这里可以说观点鲜明、态度明确,不和稀泥。与其看那些盲目推崇Go语言的人和文章,笼统的说“好”,不如也顺便看看本文,具体到细节地说“不好”。凡是具体到细节的东西,都是容易证实或证伪的,比笼统的东西(无论是"黑"还是"粉")可信性更高一些。

     

    关于对作者阴谋论的声明

    有某些阴谋论者(例如谢某),说我因一个Pull Request被Go开发者拒绝而“怀恨至今”,暗示此文是故意报复、抹黑Go语言。我对Golang有恨吗?当然是有的,那是一个不爽接一个不爽(如本文一一罗列的那些),逐步累积,由量变形成质变的结果,是我对Golang综合客观评估之后的主观态度,并非由哪一个单独的事件所主导。要说Pull Request被拒绝,Rust开发者拒绝我的PR次数还少吗?比如 https://github.com/mozilla/rust/pull/13014 和 https://github.com/liigo/rust/tree/xp (https://github.com/rust-lang/rust/issues/12842),要是再算上被拒的Issues,那就多的数不清了。我显然不可能因为某些个别的事件,影响到我对某个事物的综合评估(参见前文)。那本文是“故意抹黑”Go语言吗?我觉得不是,理由有二:1、这是作者的主观感受,2、这些感受是以许多客观事实为基础的。如果本文一一列出的那些现象,是不存在的,是虚构出来的,是凭空生成的,那么作者一定是“低级黑”。问题是,那些都是客观存在的事实。把事实说出来,怎么能叫“黑”呢?欢迎读者客观而详细的指正本文中的所有错误。

     

    关于Golang 2.0的泛型

    今天(2020年2月19日)看到HN的一篇关于 Go2 Generics 的讨论。有网友说到:

    Ken Thompson and Rob Pike are mostly out not at all involved with Go anymore. They are 2/3 of the original creators. It’s different people making the decisions now.

    我找到如下两个链接基本证实了Rob Pike确实已经淡出Golang的核心开发组:

    Rob Pike最近两年仅提交了4k行无关紧要的代码;Ken Thompson就更不用说了,许多年前就已经淡出;Russ Cox似乎也不太参与Go2相关的决策。如此看来,对于Go2的泛型而言,非技术方面的障碍已不存在,剩下只是技术性障碍。

    Ian Lance Taylor 上周(2020年2月13日)说到

    We're working on it. Some things take time.

     

    展开全文
  • go语言(二)

    2020-02-24 23:17:20
    执行go程序的几种方式 Go没有分号,认为每一行就是一句话的结束 第一个go程序 package main import "fmt" func main() { fmt.Println("hello world!") } package main表示该程序hello.go文件所在的包是...
  • go语言版本

    2018-12-15 19:44:18
    2007年,谷歌工程师Rob Pike, Ken Thompson和Robert Griesemer开始设计一门全新的语言,这是Go语言的最初原型。 2009年11月10日,Go语言以开放源代码的方式向全球发布。 2011年3月16日,Go语言的第一个稳定(stable)...
  • Go语言的9大优势和3大缺点

    万次阅读 多人点赞 2018-09-20 22:06:01
    Go的优势 原因 1:性能 Go 极其地快。其性能与 Java 或 C++相似。在我们的使用中,Go 一般比 Python 要快 30 倍。以下是 Go 与 Java 之间的基准比较: 原因 2:语言性能很重要 对很多应用来说,编程...
  • Go语言

    万次阅读 2020-05-04 10:15:35
    文章目录1. 计算机操作系统简介2.了解LINUX主要发行版:CENTOS、RHEL、FEDORA、UBUNTU、SUSE3.安装Linux操作系统的准备工作4.安装Linux操作系统。 1. 计算机操作系统简介 1)掌握操作系统的定义:操作系统是一个用来...
  • Go适合做什么?为何这么多人偏爱Go语言

    万次阅读 多人点赞 2018-12-15 22:10:42
    Go作为Google2009年推出的语言,其被设计成一门应用于搭载 Web 服务器,存储集群或类似用途的巨型中央服务器的系统编程语言。 对于高性能分布式系统领域而言,Go 语言无疑比...哪些大公司在使用Go语言: 1、Goog...
  • 什么是Go语言?有前途么?

    万次阅读 2018-04-12 01:21:30
    同类问题:什么是天命? 回答:潇洒走一回,才能告诉你。... 先“用不用学习Go语言”,“Go语言有前景么?”这类问题的朋友,能够节约些脑力,特写此篇文章:1.你必须保证精通一门语言,才能做程序员,因...
  • Go语言图形界面开发:Go版GTK

    万次阅读 热门讨论 2018-02-08 21:17:27
    本人录制的Go入门视频 go语言开发实战:https://pan.baidu.com/s/1bqOR9qZ Go语言GUI编程:https://pan.baidu.com/s/13yoUhqEUyrT_9bpi7K0rYQ ...Go语言快速入门 04、Go入门教程 Hello GTK 05、一...
  • 下载Golang语言快速上手到综合实战(Go语言、Beego框架、高并发聊天室、豆瓣电影爬虫)  下载地址:请加QQ:397245854   Go是Google开发的一种编译型,可并行化,并具有垃圾回收功能的编程...
  • Go 是一门非常不错的编程语言,并且逐渐取代 Python 成为很多人的首选语言。但它也有一些缺点让很多开发者忍不住吐槽,比如它在函数式编程、通道 / 并行切片处理、内存垃圾回收、错误处理等方面都有一些问题。本文...
  • 解剖Go语言map底层实现

    万次阅读 热门讨论 2018-08-26 02:37:30
    map是Go语言中基础的数据结构,在日常的使用中经常被用到。但是它底层是如何实现的呢? Golang中map的底层实现是一个散列表,因此实现map的过程实际上就是实现散表的过程。在这个散列表中,主要出现的结构体有两个...
  • Go语言的前景分析

    千次阅读 2019-03-22 17:28:47
    还记得2010年的时候,那个时候移动互联网时代刚刚兴起,很多以前做java的,也就是做J2EE的人(当时J2EE是红海),抓住了这个机会进行的转型,然后得到红利,甚至...目前Go语言就处于这样一个不错的时代中。 社...
  • Go语言的前世今生

    万次阅读 2017-02-15 14:44:15
    今天跟大家分享一下Go语言的发展历程。谷歌工程师的20%时间谷歌的“20%时间”工作方式,允许工程师拿出20%的时间来研究自己喜欢的项目。语音服务Google Now、谷歌新闻Google News、谷歌地图Google Map上的交通信息等...
  • Go语言适合做什么?

    万次阅读 2018-03-22 14:51:27
    Go语言主要用作服务器端开发,其定位是用来开发“大型软件”的,适合于很多程序员一起开发大型软件,并且开发周期长,支持云计算的网络服务。Go语言能够让程序员快速开发,并且在软件不断的增长过程中,它能让程序员...
  • Go语言编程的利与弊

    千次阅读 2019-05-28 15:11:41
    最近,我们使用 Go 语言编写了一个 API,Go 语言是一种开源编程语言,2009 年由 Google 推出。在使用 Go 进行开发的过程中,我们得到了很多经验和心得,想跟读者们分享,于是便有了本文。 在为项目选择编程语言时,...
  • GO语言圣经》学习初感与建议

    千次阅读 2018-09-14 17:17:55
    今天刚看了《GO语言圣经》的前二十页,感触颇深,深感此书之精髓,令人叹服,决定从今日起,记录下啃书的收获与感悟,与君共勉!!! 在记录中,我会有选择的进行分享,对那些自我感觉比较关键的细细解读,一些...

空空如也

1 2 3 4 5 ... 20
收藏数 261,051
精华内容 104,420
关键字:

go语言