golang_golang语言 - CSDN
golang 订阅
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] 
收起全文
精华内容
参与话题
  • Tao一个用golang编写的异步TCP框架
  • Golang全栈工程师入门到实战

    千人学习 2019-02-25 16:28:50
    本套课程针对于编程新手或者从未接触过编程的人群; 从Golang的发展史及基础语法直至Golang实战应用都会涉及到; 为了方便大家掌握Golang全栈开发,本套视频还包括了其他编程技术讲解。
  • 一看就懂系列之Golang准备

    千次阅读 2020-03-01 03:15:09
    前言 开始学习之前要做的一些准备...1.golang的简历 2.本地开发环境的搭建 3.编辑器的选择 4.推荐的书籍 正文 golang的简历 golang的背景和背影都很多,简单一句话介绍: ··· 123123123123 ···...

    转载请附上本文地址:https://blog.csdn.net/u011957758/article/details/81058951

    前言

    开始学习之前要做的一些准备,少走弯路:
    1.Golang的简历
    2.Golang的安装
    3.Golang项目的搭建
    4.编辑器的选择
    5.推荐的书籍

    正文

    Golang的简历

    Golang的背景和背影都很多,来一句百度的话:

    Go语言是谷歌2009发布的第二款开源编程语言。Go语言专门针对多处理器系统应用程序的编程进行了优化,使用Go编译的程序可以媲美C或C++代码的速度,而且更加安全、支持并行进程。
    

    在2009年时候,google的大佬们觉得过去十年写代码c和c++太痛苦了,很没效率,都没时间整理发型了,所以干脆自己造一个开发高效率的语言好了。
    这里写图片描述

    从此世界上最并发的语言诞生了。(php还是世界上最好的语言)

    本地开发环境的搭建

    Mac OS

    推荐两种方式:
    1.brew安装

    brew install golang
    

    安装之后可以通过"brew info golang"查看相关golang的安装信息,同时可以copy信息里头的命令,export到$PATH中。

    2.打开https://golang.org/dl/ 查找"OS X installer",就是它了。
    下载之后,按照提示一直走下去即可。

    https://golang.org/dl/无法访问的话,就去这儿:https://golangtc.com/download/
    

    Golang的安装路径:"/usr/local/go"

    执行 export PATH=$PATH:/usr/local/go/bin 增加环境变量
    

    Windows

    同mac的第二种方式,关键字"MSI installer"

    Linux

    同mac的第二种方式,关键字"tar 压缩包"

    3.Golang项目的搭建

    用go env 可查看当前go环境变量
    关注两个参数GOROOT和GOPATH即可
    这里写图片描述

    如果不喜欢默认的项目路径GOPATH配置,可以自行更改:

    vi ~/.bash_profile
    export GOROOT=/usr/local/go  #go安装的路径
    export GOPATH=$HOME/go
    export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
    source ~/.bash_profile
    

    go的大佬们约定,go必须有以下几个目录(跑到GOPATH的目录下创建三个目录):

    /usr/local/go  // (/usr/local/go为GOPATH设置目录)
      -- bin  // golang编译的可执行文件存放的路径
      -- pkg  // golang编译的.a中间文件存放的路径
      -- src  // 项目源码放的地方。同时也是go run,go build等命令的当前工作路径。
    

    编辑器的选择

    环境和项目框架搭建好了之后,编辑器的选择需要讲究一下。
    不说太多,这边推荐两个,也是我在用的。

    1.Goland

    jetBrains出品,不解释了,和phpstorm是一家,作为一个phper看着反正很爽。

    下载点击:这里
    注册码查看:这里

    2.sublime text 3

    安装完goSublime+设置完’ctrl+b’的"go build"的快捷键,可以飞起来

    (以上排名分先后,根据个人喜好优先原则)

    推荐的书籍

    不说太多,就一本。“Go程序设计语言”,够啃了。

    如果你觉得有收获~可以关注我的公众号【咖啡色的羊驼】~第一时间收到我的分享和知识梳理~
    在这里插入图片描述

    展开全文
  • 十五条有用的Golang编程经验

    千次阅读 2019-07-05 10:09:52
    原文:15 Lessons in Golang 作者:Jason Kulatunga 翻译:雁惊寒 摘要:本文作者在很短的时间内就从对Golang一无所知到开发出真正的产品。在学习Golang的过程中,他总结出十五条编程经验以分享给读者。以下是...

    原文15 Lessons in Golang
    作者:Jason Kulatunga
    翻译:雁惊寒

    摘要:本文作者在很短的时间内就从对Golang一无所知到开发出真正的产品。在学习Golang的过程中,他总结出十五条编程经验以分享给读者。以下是译文。


    像许多其他的开发者一样,我听到过很多有关Golang的传闻。也许你还不熟悉它,那么我告诉你,它是Google开发的开源语言。我之所以对Golang感兴趣,是因为它是一种静态类型编译的现代语言。

    长久以来,这就是我所知道的有关Golang的所有信息。我本打算在有空的时候详细了解一下的,但一直都有其他优先级更高的事情要做。大约4个月前,我意识到Golang也许可以用来解决我在CapsuleCD中遇到的一个问题,CapsuleCD是一款我写的可用于任何语言的通用自动化软件包发布工具(npm,cookbooks,gems,pip,jar等)。

    我遇到了这么一个问题:CapsuleCD是一个基于Ruby的可执行文件,这意味着任何想要使用CapsuleCD的人都需要在他们的机器上安装Ruby解释器,即使他们想做的只是打包一个Python库。这使得我的Docker容器更加臃肿,开发起来更加复杂。如果只需要把单个二进制文件下载到容器中就好了。所以,把项目移植到Golang这个想法在那一刻突然出现在我的脑海里。

    在接下来的几个月里,我反复思考这个想法,几周后,我终于坐了下来,开始把我的3000行Ruby应用程序移植到Golang。虽然我刚刚买了一本类似于Golang傻瓜教程这样的书,但我还是决定直接进行编码,只有在遇到问题卡住的时候才去找博客帖子和stack overflow。

    我已经听到一些人劝我放弃的声音。说实话,虽然我玩得很开心,但我最开始开发得非常慢。我是在不知道任何约定的情况下尝试着用一门新的语言来编写这个应用程序。事实是,我喜欢它。那些“啊哈!”的时刻,以及在一此巨大的重构之后再次编译成功的喜悦是一种令人难以置信的动力。

    下面是我在把应用程序移植到Golang的过程中学到的一些意想不到的以及非常规的事情。

    请注意,这些是我在写Golang代码的过程中遇到的未曾料想到的东西,我以前使用的都是流行语言以及动态类型语言(C ++,C#,Java,Ruby,Python和NodeJS)。这些观点不一定就是对Golang的批评。我能够在两周内从对这个语言零基础到发布应用程序,我真是太牛逼了。

    在写第一行代码之前

    包的布局

    虽然这对于需要编译的语言来说并不是必需的,但Golang需要,只是我并没有找到一个像Ruby、Chef或Node那样的标准目录结构。有一些比较流行的社区,但我本人还是最喜欢Peter Bourgon的建议

    github.com/peterbourgon/foo/
      circle.yml
      Dockerfile
      cmd/
        foosrv/
          main.go
        foocli/
          main.go
      pkg/
        fs/
          fs.go
          fs_test.go
          mock.go
          mock_test.go
        merge/
          merge.go
          merge_test.go
        api/
          api.go
          api_test.go

    不支持循环依赖

    当你发现Golang不支持包之间的循环依赖时,包的布局就变得尤为重要。如果A导入B,B导入A,Golang将会报错。我开始有点喜欢上它了,因为这迫使我更多地去思考应用程序的领域模型。

    import cycle not allowed
    package github.com/AnalogJ/dep/a
      imports github.com/AnalogJ/dep/b
      imports github.com/AnalogJ/dep/a

    依赖管理

    npmpypibundler,这每一个包管理器都是他们对应编程语言的代名词。然而,Golang还没有官方的包管理器。社区提供了一些不错的选择,但问题是他们都很好,要选出一个合适的博爱管理器有点困难。我最终选择了Glide,因为感觉它跟bundlernpm有点类似。

    文档

    这应该是Golang做得最好的事情之一了。 go docsgodoc.org这两个网站都非常得棒,并且所有的库的文档进行了标准化。这比包文档都是自定义和自托管的NodeJS社区前进了一大步。

    GOROOT, GOPATH

    Golang的import机制有点奇特。与大多数其他的语言不同,Golang要求把源代码放在预先配置好的文件夹中。我没有深入研究这个细节,但你应该知道这需要做一些设置,你要习惯这个。 Dmitri Shuralyov的我如何在多个工作区中使用GOPATH是一个很好的资源。

    GOPATH=/landing/workspace/path:/personal/workspace/path:/corporate/workspace/path
    

    挠痒痒

    伪结构体继承

    在设计继承模型时,Golang开发人员做了一些有趣的事情。Golang遵循类似于Ruby的多重组合模式, 而不是使用类型语言规定的更为传统的继承模型(多继承或经典继承)。 如果不能完全理解Method-Shadowing,可能会出现一些意想不到的结果。

    鸭式接口

    这是Golang的另一个很酷的意想不到的功能。我仅在动态类型语言中看到过鸭式接口。这个鸭式与struct密切相关。

    结构体中可以定义字段,但接口不行

    不幸的是,structsinterfaces不能具有相同的API,因为interfaces无法定义字段。这个问题并算很大,因为可以在接口中定义gettersetter方法,虽然这有点混乱。我相信,应该有一个技术上或者计算机理论上的解释能够回答为什么要这么做。

    Public和Private命名

    Golang将Python的publicprivate方法命名方案做了进一步发展。当我最初发现以大写字母开头的函数、结构体是public,而小写开头的则是private的时候,我哑口无言。但老实说,在用Golang开发了两个星期之后,我真的很喜欢这种习惯。

    type PublicStructName struct {}
    type privateStructName struct {}

    defer

    这是另外一个非常有用的Golang特性。我形象这是Golang实现并行处理和错误模型的结果,但defer可以很容易地让源代码看起来更清晰。从某种意义上来说,我把它看做是try-catch-finally模式下的finally方法,或是C#/Java中的using代码块。但我相信它还有更多更有创造性的用法。

    go fmt很不错

    你不会跟一个Golang开发者进行有关“Tab vs 空格”的争论。Golang有标准的代码风格,go fmt会对代码进行重新格式化。通过阅读它的源代码,我了解到了强大的parserast库。

    GOARCH、GOOS、CGO和交叉编译

    我创建CapsuleCD独立二进制文件的目的是要将端口启动到Golang上。但是,很明显,简单的静态二进制文件并不是Golang的内在特性。如果你的代码及其相关的依赖全部是用Golang写的,那么你可以用GOOSGOARCH构建静态二进制文件。但是,如果你像我一样不幸运,存在某个依赖需要在底层调用C代码的话,那么你将会陷入痛苦之中。不要误会我,创建一个动态链接库还是比较容易的。但是,要生成一个没有外部依赖关系的静态二进制文件,需要确保所有的C依赖项(及其依赖项)都是静态链接的。GOOSGOARCH支持的对应值组合表可以在Golang文档中找到。

    如何进行测试?

    藏在眼皮底下

    测试文件的后缀为_test.go,并且应该跟被测试的代码放在同一个目录中,而不要放在某个特殊的测试目录中。这还好,虽然一开始看着有点混乱。

    测试数据放在一个特殊的testdata目录中。 使用go build时,testdata目录和_test.go文件都会被编译器忽略。

    go listvendor目录

    依赖关系管理对于Golang来说是相当新鲜的,并不是所有的工具都能理解特殊的vendor文件夹。因此,当你运行go test时,默认情况下会发现它运行了所有依赖项的测试。使用go list | grep -v /vendor可以让Golang忽略vendor目录。

    go fmt $(go list ./... | grep -v /vendor/)

    if err != nil

    我是一个很看重代码覆盖率的人。我一直在努力让我的开源项目达到80%以上的代码覆盖率,但是,在使用Golang的时候,我感觉这很困难。那些已经熟悉Golang的人可能会说,Golang是一个能达到较高代码覆盖率的语言之一。Golang将所有错误都视为标准对象,而不是为错误创建一个独立的执行路径(try-catch-finally)。 Golang约定,对于可能产生错误的函数,应该在最后的return参数中返回这个错误对象。

    这是一个非常有意思的模型,这让我想起了Node的内置函数。然而,就像Node一样,把会生成错误的单元测试写入到内置函数中可能会很困难。当你按照编码模式抛出错误,然后在上层处理错误时,就会变得很烦人,如下所示:

    data, err := myfunction(...)
    if(err != nil){
        return err
    }
    
    data2, err2 := myfunction2(...)
    if(err2 != nil){
        return err
    }

    这会很快弄乱你的代码。在这一点上,有些人可能会认为interfacesmock能解决这些问题。虽然在某些情况下是这样,但是针对内置的库(如osioutil)来编写大量的interfaces,或者将这些库作为参数来传递,我认为并不合适,这样做只是让我们能够合理地生成ioutil.WriteFileos.MkdirAll的错误而已。

    我认为这绝对是我心智上一个缺陷。我已经阅读了大量关于如何对Golang进行单元测试和提高代码覆盖的文档和博客文章,但是我还是没有找到一个不需要依赖注入的模式。Golang似乎很讨厌过于繁琐。

    结论

    我很乐意听到你的想法。我刚刚用Golang工作了几个星期,但这是一个令人难以置信的受教育并且很愉快的经历。我能够在很短的时间内从没有任何经验到开发出一个真正的产品,而不是教科书上的一个例子。我知道我并不是Golang专家,而且对于Golang的了解还存在理论上的差距,但是,当我写下这篇文章的时候,我发现自己走的比预想的要远得多。

    Golang按照我原来设想的做了,给了我一个二进制文件,我不再需要Ruby解释器,可以很轻松地下载到Docker容器中。如果你还在用其他语言维护可执行程序,我建议你考虑一下Golang,给Golang一次尝试。

    展开全文
  • Go 语言为何不受待见?

    万次阅读 2019-03-25 17:48:40
    Go语言为何不受待见?事实上,Go仍然是一种相当不错的语言,并且逐渐取代Python成为很多人的首选语言。但是其却有一些问题,使得开发速度大受影响。本文就跟随作者一起解读...
        

    640?wx_fmt=gif

    Go语言为何不受待见?事实上,Go仍然是一种相当不错的语言,并且逐渐取代Python成为很多人的首选语言。但是其却有一些问题,使得开发速度大受影响。本文就跟随作者一起解读下Go中那些“硬伤”设计。

    640?wx_fmt=jpeg

    作者 | Ben E. C. Boyter
    译者 | 苏本如

    责编 | 郭芮
    出品 | CSDN(ID:CSDNnews)

    以下为译文:

    Go作为一种编程语言来说是相当体面的,然而,我在公司Slack(译者注:一种团队协作工具)的编程频道上对它的抱怨却越来越多(猜到我是做啥了的吧?)。我想我还是把这些抱怨写下来放在这里,这样当人们问我到底抱怨什么时,我就可以给他们一个链接,让他们直接到这里来看。


    640?wx_fmt=png


    过去一年左右的时间我都一直在大量地使用Go语言来编程,写一些命令行应用程序、scc(https://github.com/boyter/scc/)、lc(https://github.com/boyter/lc/)和一些API等等。其中包括一个供客户端调用代码高亮插件(https://github.com/boyter/searchcode-server-highlighter)的大规模API,这个代码高亮插件很快将会在https://searchcode.com/网站中使用。


    我在这里的批评是专门针对Go编程语言的。然而,我对我使用的每种编程语言都有抱怨。这里我引用一下C++编程语言之父Bjarne Stroustrup说过的一句话:


    “世界上只有两种编程语言:一种是人们抱怨的语言,另一种是没人使用的语言。”——Bjarne Stroustrup



    640?wx_fmt=png

    缺乏函数式编程



    我不是一个函数式编程的狂热分子。Lisp语言让我首先想到的是语言障碍,

    这可能是我使用Go语言编程时最痛苦的地方。


    和大多数开发者不一样,我不想要泛型,我认为这只会给大多数Go项目增加不必要的复杂性。我想要的是一些可以应用于内置的Slice(切片)和Map类型之上的函数方法。Slice和Map这两种类型都可以容纳任何类型,而且是泛型的,这种在某种意义上很神奇。然而Go的泛型不使用接口的话,就无法实现自己,这样就损失了所有的安全性和性能。


    举个例子,考虑下面的需求。


    给定两个字符串片断,找出这两段字符串片断中都包含的相同的子字符串,并将其放入一个新的字符串片断中,以便我们稍后处理它。


    existsBoth := []string{}
    for _, first := range firstSlice {
        for _, second := range secondSlice {
            if first == second {
                existsBoth = append(existsBoth, proxy)
                break
            }
        }
    }


    上面的Go语言的解决方法很简单。但我们还有其他方法,如使用Map来解决这个问题,使用Map可以减少运行时间,但是如果我们的内存容量有限,或者我们没有很大的片断需要处理,那么额外的运行时间并不足以抵消它带来的复杂性。


    让我们将其与Java中使用Stream和函数编程来实现相同逻辑的代码比较一下。


    var existsBoth = firstList.stream()
                    .filter(x -> secondList.contains(x))
                    .collect(Collectors.toList());


    上面的代码确实将算法的复杂性隐藏起来,从代码上看清楚要实现的逻辑容易得多。


    与实现同样功能的Go代码相比,上面的代码的意图是显而易见的,真正的简洁之处是添加额外的过滤器也变得非常简单。而如果用Go语言实现像下面的示例一样添加额外的过滤器,我们就必须在已经嵌套的for循环中再添加两个if条件。


    var existsBoth = firstList.stream()
                    .filter(x -> secondList.contains(x))
                    .filter(x -> x.startsWith(needle))
                    .filter(x -> x.length() >= 5)
                    .collect(Collectors.toList());


    有一些使用Go Generate的项目可以为你做到上面所说的,但是如果没有好的IDE支持的话,将上面的循环提取到它自己的方法中会非常笨重,而且会带来更多的麻烦。



    640?wx_fmt=png

    通道(channel)/并行切片(Slice)处理



    Go的通道(channel)通常非常简洁。虽然它们存在一些问题会导致它永久阻塞,但它们并不打算提供安全的并发性,因为通过竞争检测机制可以很容易地摆脱这些问题。对于一个不知道有多少个值或何时结束的流,或者如果处理这些值的方法不受CPU的制约,那么通道是一个很好的选择。


    通道不太擅长的是处理那些预先知道大小并希望并行处理的切片(Slice)。


    并行处理在几乎所有其他语言中都很常见,通常发生在你有一个大的列表或切片,使用并行流、并行LINQ(语言集成查询)、Rayon(一种数据并行库)、多进程或其他一些语法,使用所有可用的CPU,对该列表/切片进行迭代处理时。你将它们应用到你的列表上,然后返回处理好的元素列表。如果你的列表有太多的元素,或者你正在使用的函数太复杂,使用一个多核系统应该也可以更快地完成。


    然而,在Go语言中,你需要怎么实现它并不明确。


    一种可能的解决方法是为切片中的每个元素生成一个goroutine。因为goroutine的开销很低,所以在某种程度上,这是一个有效的策略。


    toProcess := []int{1,2,3,4,5,6,7,8,9}
    var wg sync.WaitGroup

    for i, _ := range toProcess {
        wg.Add(1)
        go func(j int) {
            toProcess[j] = someSlowCalculation(toProcess[j])
            wg.Done()
        }(i)
    }

    wg.Wait()
    fmt.Println(toProcess)


    上面的代码会保持切片中元素的顺序,但是我们的例子并不要求实现这点。


    上面的问题首先是添加一个waitgroup,并且必须记住递增并调用它。这对开发人员开说是额外负担。如果弄错了,这个程序将不会产生正确的输出,可能是不确定的结果,也可能永远不会执行完成。另外,如果你的列表很长,你要为列表中每个单独的元素生成一个goroutine。正如我之前所说,这本身不是一个问题,因为Go语言能毫无问题地做到这一点。但问题是,每一个goroutine都要为使用CPU的时间片而竞争。因此这不是执行此任务的最有效方法。


    你可能想做的是为每个CPU生成一个goroutine,并让它们依次挑选处理它的列表。增加一个goroutine的开销很小,但是对于一个迭代次数很多的循环来说,这个开销并不算小。当我在为scc项目工作时,我遇到了这个问题,它在每个CPU的内核上创建了一个goroutine。如果要完全用Go语言的方式来解决这个问题,你就需要创建一个通道,然后循环你的每个切片元素,让你的函数从该通道读取,然后再从另一个通道读取。


    让我们看看代码。


    toProcess := []int{1,2,3,4,5,6,7,8,9}
    var input = make(chan intlen(toProcess))

    for i, _ := range toProcess {
        input <- i
    }
    close(input)

    var wg sync.WaitGroup
    for i := 0; i < runtime.NumCPU(); i++ {
        wg.Add(1)
        go func(input chan int, output []int) {
            for j := range input {
                toProcess[j] = someSlowCalculation(toProcess[j])
            }
            wg.Done()
        }(input, toProcess)
    }

    wg.Wait()
    fmt.Println(toProcess)


    上面的代码先是创建了一个通道,循环我们的切片并将每个值放入其中。接着,为每个CPU内核创建一个goroutine来处理输入的值,然后等待它全部完成。要消化的代码很多。


    这不是一个你应该怎么做的问题,因为如果你的切片非常大,你可能不想有一个具有相同长度的缓冲区的通道,所以你实际上应该创建另一个goroutine来循环切片,并将这些值放入通道。当处理完成后,它关闭通道。我已经删除了这个代码,因为它使代码变得更长,而且我已经基本上知道怎么做了。


    Java的做法和上面大致相同。


    var firstList = List.of(1,2,3,4,5,6,7,8,9);

    firstList = firstList.parallelStream()
            .map(this::someSlowCalculation)
            .collect(Collectors.toList());


    是的,Go语言的通道(channel)和Java中的流(stream)并不是一回事,通道更接近于Java中的队列(queue),但我们这里的目的不是1对1的对比。我们想要的是使用我们所有的CPU内核来处理一个切片/列表。


    当然,如果某个slowcaluation实际上是一个在网络上调用的方法,或者是其他一些需要大量CPU的方法,那么这就不是一个问题。在这种情况下,通道和goroutine都很出色。


    这一问题与缺乏函数式编程有关。如果Go语言在slice/map对象之上有函数方法,那么添加这个功能是可能的。这也很烦人,因为如果Go支持泛型的话,就会有人可以把上面谈到的写成一个函数库,就像Rust的Rayon一样,每个人都会受益。


    顺便说一句,我认为这一点阻碍了Go语言在数据科学领域的任何成功,因此,为什么Python仍然是那里的王者。而Go语言在数字操作中缺乏表现力和力量——以上就是原因。



    640?wx_fmt=png

    垃圾回收(GC)



    Go语言的垃圾回收机制非常可靠。每次Go语言版本更新,我都发现我的应用程序变得更快了,原因通常是因为GC的改进。将延迟的优先级置于所有其它要求之上,对于API和UI来说,是一个完全可以接受的选择。同样地它也适用于任何有网络呼叫的情况,这些呼叫也会成为瓶颈。


    关键是Go语言对UI功能的实现没有任何好处(据我所知没有合适的绑定),当你需要尽可能大的吞吐量时,这个选择确实会伤害你。我在处理scc项目时遇到了一个大问题,scc是一个命令行应用程序,对CPU的要求很高。这是个问题,我添加了一个逻辑来关闭内存回收机制,直到内存使用量达到阈值。但是,我不能禁用它,因为程序在某些情况下工作时很快就会耗尽内存。


    对GC缺乏控制有时令人沮丧。你学会了接受它,但有时你会说“嘿,这里的代码真的需要尽可能快的运行,所以如果能切换到高吞吐量模式一段时间,那就太好了。”


    我认为随着Go语言的1.12版本的发布,这一点变得越来越不可能了,在这个版本中,GC看起来再次得到了改进,但是仅仅关闭和打开GC并不是我想要的控制。有时间的话我会再次深入了解一下。



    640?wx_fmt=png

    错误处理



    我不是唯一一个对这点有抱怨的人,但我必须写出来。


    value, err := someFunc()
    if err != nil {
        // Do something here
    }

    err = someOtherFunc(value)
    if err != nil {
        // Do something here
    }


    上面的代码看起来相当乏味。Go语言甚至不强制你处理大家建议的错误。你可以显式忽略它(这是否算作处理它?),你甚至可以完全忽略它。例如,我可以像这样重写上面的内容:


    value, _ := someFunc()

    someOtherFunc(value)


    你很容易发现我省略了somefunc返回的内容,但是someotherfunc(value)同时也可以返回错误,而我却完全忽略了这个错误,对它不作任何处理。


    老实说,我不知道有这里有什么解决办法。不过我喜欢Rust言语的问号(?)操作符,它可以避免这个问题。另外V-Lang(https://vlang.io/)看起来也可能有一些有趣的解决方案。


    另一个想法是可选类型(Optional Type)和删除nil,但是这些在Go语言的2.0版本中是永远不会出现的,因为它会破坏向后兼容性。



    640?wx_fmt=png

    总结



    总的来讲,Go仍然是一种相当不错的语言。如果你要我要写一个API,或者一些需要快速进行大量磁盘/网络调用的应用,它仍然是我的第一选择。事实上,我正处在这样一个阶段:Go已经取代Python,成为我要完成的大量的一次性任务的首选语言。数据合并任务除外,因为缺乏函数式编程仍然是一件痛苦的事情,这使得开发速度大受影响。


    对诸如像字符串stringA == stringB和编译错误的比较,你会发现Go语言的切片用在这里非常合适。它不像我在上面用来比较的Java语言那样经常有出人意料的结果。


    Go的二进制文件的大小可以更小(一些编译开关和upx(可执行文件压缩工具)可以解决这个问题),我希望它在某些方面运行得更快一些,GOPATH不是很好,但也没有每个人所说的那么糟糕,默认的单元测试框架缺少很多功能,Mocking有点痛苦等等。


    Go仍然是我使用过的一种更有效的语言。我会继续使用它,尽管我希望https://vlang.io/ 最终能够发布并且解决我的许多投诉的问题。它可能Go 2.0版,可能是Nim,也可能是Rust。现在有很多很酷的新语言可以玩。我们的开发人员真的被宠坏了。

    原文:https://boyter.org/posts/my-personal-complaints-about-golang/

    本文为 CSDN 翻译,如需转载,请注明来源出处。


     热 文 推 荐 

     华为 5G 硬实力

     Java 开发者希望未来使用 Python 和 Go

    “边缘计算将吞掉云计算!”

    ☞ 18 岁少年盗取价值 90 万元的萌乃币, 交易所被迫关停!

    李笑来登顶 GitHub TOP 榜!币圈大佬要教程序员如何自学编程

    ☞ 马云:蚂蚁金服这样做区块链!

    女生适合做程序员吗?

    Google首页玩起小游戏,AI作曲让你变身巴赫

    曝光!月薪 5 万的程序员面试题:73% 人都做错,你敢试吗?

    System.out.println("点个在看吧!");
    console.log("点个在看吧!");
    print("点个在看吧!");
    printf("点个在看吧!\n");
    cout << "点个在看吧!" << endl;
    Console.WriteLine("点个在看吧!");
    Response.Write("点个在看吧!");
    alert("点个在看吧!")
    echo "点个在看吧!"

    640?wx_fmt=gif点击阅读原文,输入关键词,即可搜索您想要的 CSDN 文章。

    640?wx_fmt=png喜欢就点击“在看”吧!
    展开全文
  • 论据 channel goroutine

    论据

    channel

    goroutine

    TODO

    展开全文
  • emmm暂未开源,先上图。其实有很多东东都未完成,一步一步来吧 这里是大图 这里会有二维码的,暂未写完哈 注册界面 后台 测试地址 测试地址al.landv.pw:88 测试账号:admin ......
  • Golang 开发工具

    万次阅读 2018-12-16 15:32:56
    作为一个理想的开发工具,可以设定对其的期望,具体如下:  ·支持语法高亮的文本编辑  ·支持Unicode编码,便于在代码中直接使用非英文字符串  ·支持工程构建  ·直接执行构建结果  ·单元测试 ...
  • golang&和*的区别

    千次阅读 2019-04-14 20:28:50
    &符号的意思是对变量取地址 *符号的意思是对指针取值
  • Golang 关于通道 Chan 详解

    万次阅读 多人点赞 2017-02-03 16:45:44
    首先我们来看线程,在golang里面也叫goroutine在读这篇文章之前,我们需要了解一下并发与并行。golang的线程是一种并发机制,而不是并行。它们之间的区别大家可以上网搜一下,网上有很多的介绍。下面我们先来看一个...
  • Go 语言开发必须知道的 17 种利器

    千次阅读 2018-08-15 11:33:21
    本期为大家精选了码云上优秀的 Go 语言开源项目,涵盖了文件服务系统、Web...项目简介:golang 基于 gridFs 的分布式文件服务,其支持: POST GET 上传 图片大小控制 文件下载,秒传,转正处理等。 项目地址:htt...
  • golang基础教程

    万次阅读 多人点赞 2019-05-28 21:38:58
    golang基础教程(一)、环境搭建 golang基础教程(二)、开发规范及API golang基础教程(三)、变量与数据类型概述 golang基础教程(四)、基本数据类型 golang基础教程(五)、基本数据类型的转换 golang基础教程...
  • golang中文字符编码转换

    万次阅读 2017-12-08 21:38:56
    golang处理中文时默认是utf8,当遇到其他如GBK字符是就会出现乱码,此处介绍golang 官方golang.org/x/text/encoding/simplifiedchinese包下的编码转换 package main import "golang.org/x/text/encoding/...
  • for k,v := range Xxx { }
  • golang判断key是否在map中

    万次阅读 2015-11-23 16:04:24
    判断方法示例代码 ...另外golang也没有提供item是否在array当中的判断方法,如果程序里面频繁用到了这种判断,可以将array转化为以array当中的成员为key的map再用上面的方法进行判断,这样会提高判断的效率.
  • golang字符串去除空格和换行符

    万次阅读 2016-04-21 15:53:54
    package main import ( "fmt" "strings" ) func main() { str := "welcome to kimi\nfly\n.com" // 去除空格 str = strings.Replace(str, " ", "", -1) ... str = strings.Replace(str, "\n", "", -1) fm
  • golang 在windows中设置环境变量

    万次阅读 2018-03-03 14:42:52
    安装完成后需要在系统环境变量中设置GOPATH为项目目录GOROOT为安装目录path中设置好安装目录到bin目录打开cmd,输入go env,出现如下配置生效
  • 由于众所周知的原因,golang在下载golang.org的包时会出现访问不了的情况。尤其是x包,很多库都依赖于它。由于x包在github上都有镜像,我们可以使用从github.com上先clone下来,再做软链接的方式曲线救国。   ...
  • Golang 获取当前系统架构和操作系统

    万次阅读 2017-04-13 14:15:22
    runtime.GOARCH 返回当前的系统架构;runtime.GOOS 返回当前的操作系统。
  • golang.org不能访问解决方法

    万次阅读 2016-12-06 19:14:17
    最近访问golang.org官网总是访问不了,下载包失败。找了好多资料,说是外国的IP,经常访问不了。 开源中国第三方包 http://www.golangtc.com/download/package 在输入框中输入 你想要获取的包 点击GO! 它会一直获取...
1 2 3 4 5 ... 20
收藏数 123,590
精华内容 49,436
关键字:

golang