V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
woahishui
V2EX  ›  程序员

golang 语言学习有感

  •  
  •   woahishui · 2020-01-15 11:24:07 +08:00 via Android · 7897 次点击
    这是一个创建于 1777 天前的主题,其中的信息可能已经有所发展或是发生改变。
    刚开始学习 golang,越看越有 basic 语言的味道,但是有没有 basic 丰富,难道是简化的 basic 语言
    58 条回复    2020-01-17 21:45:31 +08:00
    zjsxwc
        1
    zjsxwc  
       2020-01-15 11:32:40 +08:00
    你加入 CSP 编程模式试试
    tt67wq
        2
    tt67wq  
       2020-01-15 11:33:28 +08:00
    难道不是 c 语言的味道?
    zcreg
        3
    zcreg  
       2020-01-15 11:37:08 +08:00
    难道不是 c 语言的味道?
    cmdOptionKana
        4
    cmdOptionKana  
       2020-01-15 11:37:49 +08:00   ❤️ 1
    对于喜欢奇巧淫技的人来说,golang 显得不够简洁、优雅、好玩。

    但其实 golang 的精简恰到好处,当你用 golang 写了程序,过一段时间回头去修改的时候就会发现 golang 的伟大,它让一切都井井有条一目了然,并且非常容易重构和扩展。
    lihongjie0209
        5
    lihongjie0209  
       2020-01-15 11:42:20 +08:00   ❤️ 13
    @cmdOptionKana #4 从来没听说使用了 xxx 语言就能把代码组织好的
    pursuer
        6
    pursuer  
       2020-01-15 12:17:49 +08:00
    c 语言有形成标准的 ABI (这使得 C 可以容易的热更新动态库),可以用宏,没有 GC,类型前置,类型隐式转换,不支持闭包,这些都是和 Go 不一样的地方,我觉得 go 和 C 差挺多的吧。
    wellsc
        7
    wellsc  
       2020-01-15 13:10:53 +08:00   ❤️ 4
    @cmdOptionKana 尤其是 error handler,简直独一无二
    ytll21
        8
    ytll21  
       2020-01-15 13:11:59 +08:00
    @cmdOptionKana 伟大都用上了。。。允许我吐一会儿。。。哈哈哈,抱歉,无恶意
    d0m2o08
        9
    d0m2o08  
       2020-01-15 13:16:58 +08:00
    golang: 我不相信你们的技术,就按我的条条框框来,别瞎鸡儿折腾
    qq316107934
        10
    qq316107934  
       2020-01-15 13:19:47 +08:00 via Android
    @cmdOptionKana 除了处理 json 数据麻烦的要死
    Hanggi
        11
    Hanggi  
       2020-01-15 13:21:19 +08:00
    我觉得 go 语言最大特点是在编写和编译层面都强制用户遵守他们的规则,使得 go 语言写出来的代码相比其他语言没有那么多的变种和奇葩。当其他语言在争吵这个地方要不要空格、那个地方要不要缩紧或是换行的时候,gofmt 已经给你强制格式化了。
    cmdOptionKana
        12
    cmdOptionKana  
       2020-01-15 13:27:10 +08:00
    @lihongjie0209 你误会了,我并不是说用 golang 就一定能让代码绝对组织得非常好。我的意思是,它对更好地组织代码有帮助,在我看来,帮助很大。
    cmdOptionKana
        13
    cmdOptionKana  
       2020-01-15 13:29:11 +08:00   ❤️ 1
    @qq316107934 再忍一会儿,马上就有改进了,因为那是由于缺少泛型而导致的麻烦,很快就会支持泛型。
    lewis89
        14
    lewis89  
       2020-01-15 13:31:02 +08:00
    @Hanggi #11 这些 空格 tab 换行 圣战者 都是一些根本不懂编程的初学者,好的语言根本不屑于在这上面提供一些条条框框的东西。
    k9982874
        15
    k9982874  
       2020-01-15 13:33:06 +08:00
    @wellsc #7 上来直接打脸就不好了啊
    lihongjie0209
        16
    lihongjie0209  
       2020-01-15 13:34:26 +08:00   ❤️ 1
    @Hanggi #11 你觉得代码的问题是格式化的问题? clean code 难道是教你怎么配置 editor config? effective java 教你怎么缩进?
    charlie21
        17
    charlie21  
       2020-01-15 13:34:27 +08:00   ❤️ 1
    学了汉语拼音就开始感叹中华文化博大精深.jpg
    cmdOptionKana
        18
    cmdOptionKana  
       2020-01-15 13:36:05 +08:00   ❤️ 2
    @wellsc 刚开始我也很烦它的错误处理,烦到炸。

    但是后来发现,这其实是因为错误处理本身就是个麻烦事,try catch 那种方式企图掩盖错误处理的麻烦本质,但是并不完美,也有很多缺陷。

    golang 那样设计是为了把这个麻烦本质暴露出来,如果根据 golang 的设计思想认真处理每一个 error,就会发现这对代码 debug 带来很大帮助。

    加上最近 errors 库的小改进以及即将到来的一些改进,这个一直被很多人诟病的缺点也会得到很大改善。
    Hanggi
        19
    Hanggi  
       2020-01-15 13:43:51 +08:00
    @lihongjie0209
    @lewis89
    代码格式化只是一个最直接的例子,这种设计体现在 GO 语言的方方面面,你们可以自行体会。

    简单说 GO 语言的优点有以下几点:
    强制的代码风格(仁者见仁)
    强大的标准库
    对操作系统极少的依赖
    优秀的性能

    这些东西可能其他语言也都能满足,但是合到一起就会对上某些人的胃口,自然会赞不绝口。
    wutiantong
        20
    wutiantong  
       2020-01-15 13:46:40 +08:00   ❤️ 2
    为啥国内 Golang 的信徒那么多啊?
    fanpei0121
        21
    fanpei0121  
       2020-01-15 13:48:45 +08:00
    lihongjie0209
        22
    lihongjie0209  
       2020-01-15 13:51:52 +08:00
    @Hanggi #19 你说的这些东西只要是现代语言都满足:

    Python:

    自带电池 -> 强大的标准库
    基于解释器的 -> 不依赖操作系统
    优秀的性能 -> 要性能的就是 C 来写

    JavaScript

    npm -> 强大的标准库
    我有 V8 -> 对操作系统极少的依赖
    我有 V8 -> 优秀的性能

    Java
    我只管创建接口, 实现大厂来做 -> 强大的标准库
    我有 JVM -> 对操作系统极少的依赖
    我有 JVM -> 优秀的性能

    以上所有:
    强制的代码风格 -> editor config / ide 配置文件
    fanpei0121
        23
    fanpei0121  
       2020-01-15 13:52:32 +08:00
    @wutiantong 个人以为,golang 同时兼顾了开发效率与运行效率。其他语言都比较极端。
    bbao
        24
    bbao  
       2020-01-15 13:55:30 +08:00
    @Hanggi

    强大的标准库?兄弟你再搞笑?
    Hanggi
        25
    Hanggi  
       2020-01-15 14:05:37 +08:00
    @lihongjie0209
    你自己都承认了,
    java 要低系统依赖是不是要 jvm, 跑个服务器是不是还要用 tomcat、maven 之类的?
    跑 v8 你不需要装 node 吗?
    python 是不是还要借助 cpython ?
    ide 上的各种配置是不是每家公司都有些许的差异呢?

    而 GO 语言在语言层面就实现了这些。我并没有说 go 语言在所有这些方面都做到最好了,但确实给开发者带来了不一样的体验。并且出现了不少杀手级项目,其他语言也能开发出这些项目,那为什么要用 GO 语言呢?
    lihongjie0209
        26
    lihongjie0209  
       2020-01-15 14:11:10 +08:00
    @Hanggi #25 我懂了, 你说的系统依赖是不需要虚拟机, 直接编译产生机器码的那种.
    fiypig
        27
    fiypig  
       2020-01-15 14:16:23 +08:00
    我只知道我可能我会在 go 终老了
    VoidChen
        28
    VoidChen  
       2020-01-15 14:24:24 +08:00   ❤️ 1
    我以为真的写过代码或者用过 2 种或以上语言的人应该都不会说出这样的话。。。
    wutiantong
        29
    wutiantong  
       2020-01-15 14:51:48 +08:00
    @fanpei0121 为啥你回复里 at 我但我没收到 unread 提醒呢?
    guolaopi
        30
    guolaopi  
       2020-01-15 14:59:43 +08:00
    @lihongjie0209 孤陋寡闻了我,还没看过 go,难道 go 是直接拿记事本撸完就能跑了吗?(滑稽
    yukiloh
        31
    yukiloh  
       2020-01-15 15:08:46 +08:00 via Android   ❤️ 1
    一开始觉得 defer recover 牛逼,实际写起来要依靠 ide 比如 jb 的 template,iferr 也是,如果没有快捷输入真的烦…
    还有神一样的墙,感谢七云牛
    还有包管理…现在有 module 好多了
    smallyu
        32
    smallyu  
       2020-01-15 15:23:41 +08:00
    basic 的多线程是什么写的?
    zunceng
        33
    zunceng  
       2020-01-15 15:36:11 +08:00
    关于错误处理

    https://developer.aliyun.com/article/740696


    习惯用 try catry 的, 回头好好读一下自己代码 写了多少 bug ( PS: 可能也不容易看出来)
    lihongjie0209
        34
    lihongjie0209  
       2020-01-15 15:43:15 +08:00
    @zunceng #33 嗯, 找个机会把 JDK 源码中关于 try cache 的 BUG 找出来, 提个 issue
    hujianxin
        35
    hujianxin  
       2020-01-15 15:55:08 +08:00
    @cmdOptionKana 很快支持泛型,有多快呀
    xpresslink
        36
    xpresslink  
       2020-01-15 15:57:48 +08:00
    强制的代码风格(仁者见仁)
    强大的标准库
    对操作系统极少的依赖
    优秀的性能
    这些都不是语言的本质。
    @Hanggi 够浪的设计目标就是个有垃圾回收的 C 语言,减小开发难度和负担,所以比较适合 Go 的使用场景比 C 语言还要少。业务逻辑复杂度低又需要一定的性能服务后端开发,例如微服务。
    ChristopherWu
        37
    ChristopherWu  
       2020-01-15 16:20:03 +08:00
    来让我喷一下 go:

    1. 没有高性能好用的泛型,你说 interface{}?那个连 go 作者都受不了,因此导致没有抽象库可用如 reduce, map, flitter, any 等等函数;
    2. 错误处理,就算是用`product type`,也没有设置好用的语法糖将 error 迭代下去,导致大量重复冗余的 if else
    3. 自作主张的 golint, 你要是希望自己比较严谨,希望社区统一,就不要定死那么多可有可无的东西,大括号换行这些没所谓。cpu CPU Cpu 大小写没所谓,但,if else 我就喜欢用 else 显示标注,你连这要管我?? 我 export 函数就是不喜欢写注释你给我报错???还不能自定义??
    4. 一开始没有想做好 包管理器 给开源社区的人用。。导致现在一大堆。。
    想到再补充。。
    laravel
        38
    laravel  
       2020-01-15 16:28:12 +08:00
    我只想用 go 语言实现 raft 协议,但是现在还没有任何行动
    alphatoad
        39
    alphatoad  
       2020-01-15 16:34:14 +08:00 via iPhone
    讲道理 讲道理
    动态语言生成二进制或者打包一个运行时也是分分钟的事
    高级语言哪有真不依赖运行时的,libc、posix 之类的算🐴?
    lihongjie0209
        40
    lihongjie0209  
       2020-01-15 16:37:41 +08:00
    @alphatoad #39 系统调用还是要依赖的
    charlie21
        41
    charlie21  
       2020-01-15 16:38:07 +08:00
    PHP:不配有姓名?
    dyllen
        42
    dyllen  
       2020-01-15 18:05:41 +08:00
    go 可以让你专注自己的代码吧,其他的就不用管太多了。
    这语言可以这样,也可以那样,你要花费时间精力去搞呀。
    blless
        43
    blless  
       2020-01-15 18:37:53 +08:00 via Android
    @lihongjie0209 #34 很多人喷 go 的错误处理,实际上程序执行起来就是这么多错误,try catch 给很多人根本不知道啥时候应该 catch 啥时候 throw。go 给新人一个要求,就是好好处理每个 error。比之前我司 java c#写的程序不知道稳定了多少
    CRVV
        44
    CRVV  
       2020-01-15 18:46:16 +08:00
    @lihongjie0209

    重点当然不是格式化的问题
    举一个另外的例子

    sync.Map 上没有 length 或者 size 方法,获取元素的数量要用 sync.Map.Range 遍历
    https://github.com/golang/go/issues/20680
    这个链接有解释说为什么不加这个方法,a Len method would either be misleading or inefficient

    类似这样的例子应该还有一些,所以有人觉得拿 Go 写的代码质量会更高,因为一些 misleading 或者 inefficient 的功能直接被删掉了



    > Python:
    > 优秀的性能 -> 要性能的就是 C 来写

    几乎所有的语言都能调用 C 代码,照你这个说法,任何一个语言都有优秀的性能

    > JavaScript
    > npm -> 强大的标准库

    npm 不是标准库,而且我几乎没见过有人给 JavaScript 的标准库说过好话

    > Java
    > 我有 JVM -> 优秀的性能

    性能指的不单是执行时间,内存占用量也是性能的一部分,而 JVM 在这方面的性能很渣
    即使单说执行时间,JVM 可能也只是在吞吐量上有优势
    blless
        45
    blless  
       2020-01-15 18:56:16 +08:00 via Android
    go 的优势就在于取舍得当,现在写代码的人完全没有其他工程领域的严谨性。别的行业搞工程图纸工具测量规划设计年限都整得妥妥的。软件工程里面单元测试,覆盖测试,性能测试能做好的都没有几个。没错,就是看多了别人的代码,事实证明别人的代码根本不能相信!就需要 Go 这种静态编译型语言强制性约束!
    fps23dot9999
        46
    fps23dot9999  
       2020-01-16 09:46:11 +08:00
    @cmdOptionKana 这段话好有翻译腔
    cmdOptionKana
        47
    cmdOptionKana  
       2020-01-16 09:54:08 +08:00
    @fps23dot9999 我故意的,现代汉语不用翻译腔总是感觉不够准确,容易有歧义。
    libook
        48
    libook  
       2020-01-16 10:41:50 +08:00   ❤️ 1
    个人感受 Go 是一个完全贴合工业化软件生产的语言,提供的特性精简、直达,让任何需求都有尽可能少的方案来实现(只有 1 种方案的话就不需要纠结了),让开发者将精力放在业务本身,把业务之外的问题都透明化解决。

    所以某种角度上来讲,“简”是 Go 的设计哲学之一。

    以上个人感受,不同人可能会有不同的感受。
    ChristopherWu
        49
    ChristopherWu  
       2020-01-16 11:27:02 +08:00
    @libook 一个问题,你写业务的时候,没有泛型用,都 copy-paste,看着一大坨逻辑都一样的代码,不觉得有🤢难受的感觉吗
    o562dsRcFqYl375i
        50
    o562dsRcFqYl375i  
       2020-01-16 12:37:22 +08:00
    PHP:卑微如我
    bbao
        51
    bbao  
       2020-01-16 13:48:22 +08:00
    @blless
    try catch 给很多人根本不知道啥时候应该 catch 啥时候 throw

    那是你可能不会,并不是很多人根本不知道。
    Evilk
        52
    Evilk  
       2020-01-16 14:15:30 +08:00
    PHP:我在哪里?
    reus
        53
    reus  
       2020-01-16 14:59:02 +08:00
    @ChristopherWu 没有泛型你可以用反射,不是一定要用复制粘贴。
    blless
        54
    blless  
       2020-01-16 18:02:28 +08:00 via Android
    @bbao 得了吧,你把 java 每个 try catch throw 都处理一下照样不少,多少人直接有 catch 一下就当无事发生。你挨个处理就光数组越界空指针错误就处理不完。
    jin7
        55
    jin7  
       2020-01-16 20:33:38 +08:00
    java python 不香....吗
    bbao
        56
    bbao  
       2020-01-17 14:49:14 +08:00
    @blless 并没有此赶脚哦,可能你用的不好
    woahishui
        57
    woahishui  
    OP
       2020-01-17 15:06:41 +08:00 via Android
    @bbao 刚开始学习
    blless
        58
    blless  
       2020-01-17 21:45:31 +08:00 via Android
    @bbao 是我菜鸡了,用 go 的都是菜鸡 大佬无视我好吧
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3325 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 12:30 · PVG 20:30 · LAX 04:30 · JFK 07:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.